페이지

13265번: 색칠하기

https://www.acmicpc.net/problem/13265


$O(t(n+m))$

홀수 개수의 노드로 이루어진 사이클이 존재하면 불가능, 그러한 사이클이 존재하지 않는다면 가능하다.


#include<cstdio>
#include<vector>
using namespace std;
int t, n, m, ck[1001], r;
vector<int> adj[1001];
void f(int h) {
    for (auto it : adj[h]) {
        if (!ck[it]) ck[it] = 3 - ck[h], f(it);
        if (ck[h] == ck[it]) r = 1;
    }
}
int main() {
    for (scanf("%d", &t); t--;) {
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= n; i++) adj[i].clear(), ck[i] = 0;
        for (int i = 0, x, y; i<m; i++) {
            scanf("%d%d", &x, &y);
            adj[x].push_back(y);
            adj[y].push_back(x);
        }
        r = 0;
        for (int i = 1; i <= n; i++) if (!ck[i]) ck[i] = 1, f(i);
        puts(r ? "impossible" : "possible");
    }
    return 0;
}

댓글 2개 :

  1. 8번 줄에서 3-ck[h] 가 어떤 역할을 하는건지 알려주실 수 있나요??

    답글삭제
  2. ck[n]은 n번 노드가 탐색 전이면 0, 탐색 이후면 홀수 번째 탐색시 1, 짝수 번째 탐색시 2가 됩니다.
    즉, n번 노드 탐색이후 ck[n]=x이면 인접한 it번 노드를 탐색하면 ck[it]=3-x가 됩니다.

    답글삭제