http://codeforces.com/problemset/problem/272/E
把仇恨关系想象为边,
因为度只能为0,1,2,3,所以有以下几种
0,1 直接放即可
2: 有(1,1),(0,2)两种情况,第一种随便放,第二种放0那里
3:有(1,2),(0,3)两种情况,第一种放1,第二种放0那里
也就是说,怎样都有解
dfs寻找即可
不过一开始觉得这样不靠谱,因为时间复杂度很高,不过没想到过了
#include <cstdio> #include <vector> using namespace std; const int maxn=3e5+5; bool other[maxn]; vector<int> e[maxn]; int n,m; void print(){ for(int i=1;i<=n;i++){ if(other[i])printf("1"); else printf("0"); } puts(""); } void judge(int s){ int o=0; for(int i=0;i<(int)e[s].size();i++){ int t=e[s][i]; if(other[t]==other[s])o++; } if(o>1){ other[s]=!other[s]; for(int i=0;i<(int)e[s].size();i++){ int t=e[s][i]; if(other[t]==other[s])judge(t); } } } int main(){ scanf("%d%d",&n,&m); for(int i=0;i<m;i++){ int f,t; scanf("%d%d",&f,&t); e[f].push_back(t); e[t].push_back(f); } for(int i=1;i<=n;i++){ judge(i); } print(); return 0; }