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