[POI2010]GIL-Guilds - 二分图染色,DFS

给一张无向图,要求你用黑白灰给点染色,且满足对于任意一个黑点,至少有一个白点和他相邻;对于任意一个白点,至少有一个黑点与他相邻,对于任意一个灰点,至少同时有一个黑点和白点和灰点与他相邻,问能否成功

Solution

显然灰色是多余的

首先考虑什么样的情况是不行的,显然仅在有孤立点的时候会挂,而连通图一定可以

所以我们只需要拿起每个连通块 DFS 随便染即可

#include <bits/stdc++.h>
using namespace std;

const int N = 1000005;
vector <int> g[N];
int n,m,a[N],vis[N],cnt;

void dfs(int p) {
    ++cnt;
    vis[p]=1;
    for(auto q:g[p]) if(vis[q]==0) {
        a[q]=a[p]^1;
        dfs(q);
    }
}

signed main() {
    ios::sync_with_stdio(false);
    cin>>n>>m;
    for(int i=1;i<=m;i++) {
        int t1,t2;
        cin>>t1>>t2;
        g[t1].push_back(t2);
        g[t2].push_back(t1);
    }
    for(int i=1;i<=n;i++) {
        if(vis[i]==0) {
            cnt=0;
            dfs(i);
            if(cnt==1) {
                cout<<"NIE";
                return 0;
            }
        }
    }
    cout<<"TAK"<<endl;
    for(int i=1;i<=n;i++) cout<<(a[i]?'K':'S')<<endl;
}

猜你喜欢

转载自www.cnblogs.com/mollnn/p/12335444.html