반응형
그래프를 만들고 DFS나 BFS 탐색을 하면 된다.
tc가 K개 있으므로, 초기화를 잘 해줘야 한다.
문제 풀이 방법은 node를 탐색하면서 색칠을 하면 된다.
색칠을 하다가, 이미 색칠이 된 곳을 검사해서 색깔이 다르면 "NO"가 된다.
3 - 2(빨강) = 1(검정) / 3 - 1(검정) = 2(빨강)이 되므로
if (!DFS(p->node, 3 - color)) return 0; 와 같은 방식으로 색칠하면 된다.
1 <-> -1 을 하는 방법도 가능하다.
DFS 풀이는 아래와 같다.
#include <stdio.h>
int K, V, E;
typedef struct st
{
int node;
struct st *next;
}NODE;
NODE HEAD[20200];
NODE POOL[202000 * 2];
int pcnt;
int check[20200];
void init()
{
pcnt = 0; /* 메모리 풀 초기화 */
for (int i = 1; i <= V;i++) HEAD[i].next = 0, check[i] = 0;
}
void Make(int p, int c)
{
NODE *nd = &POOL[pcnt++];
nd->node = c;
nd->next = HEAD[p].next;
HEAD[p].next = nd;
}
int DFS(int node, int color)
{
check[node] = color;
for (NODE *p = HEAD[node].next; p; p = p->next)
{
if (check[p->node] == color) return 0;
if (!check[p->node])
{
/* 3 - 1 = 2 <-> 3 - 2 = 1 */
if (!DFS(p->node, 3 - color)) return 0;
}
}
return 1;
}
int main(void)
{
scanf("%d", &K);
for (int tc = 1; tc <= K;tc++)
{
int flag;
scanf("%d %d", &V, &E);
init();
for (int i = 0; i < E;i++)
{
int p, c;
scanf("%d %d", &p, &c);
Make(p, c);
Make(c, p);
}
flag = 0;
for (int i = 1; i <= V;i++)
{
if (!check[i])
{
flag = DFS(i, 1);
if (!flag) break;
}
}
if (flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}
반응형
'알고리즘 > [PRO] 삼성 SW 역량 테스트 B형' 카테고리의 다른 글
삼성 B형 디버깅 Tip (0) | 2021.02.16 |
---|---|
메모리 풀 vs malloc 속도 비교 (2) | 2021.02.15 |
메모리 풀 (Memory Pool) (4) | 2021.02.15 |
BOJ 2606 : 바이러스 (Linked List) (3) | 2021.02.15 |
B형에 필요한 최적화 코드 (2) (0) | 2021.02.15 |
댓글