UVA10004- Bicoloring(二染色)
用的深搜,dfs();
挨个点染色,有边的两点染不用的颜色,分别用1,-1表示,同时判断跟这个点有联系的点是否有相同的颜色。
代码不长:
#include <iostream> #include <cstring> using namespace std; int n, in[250][250], visit[250]; int input() { memset(in,0,sizeof(in)); memset(visit,0,sizeof(visit)); int t; cin>>t; while(t--) { int a, b; cin>>a>>b; in[a][b] = 1; in[b][a] = 1; } return 0; } int dfs(int u) { for(int i = 0; i < n; i++) { if(!visit[i]&&in[u][i]){visit[i] = -1*visit[u]; if(dfs(i)==-1)return -1;} else if(in[u][i]&&visit[i]==visit[u])return -1; } return 0; } int main () { while(cin>>n&&n) { input(); visit[0] = 1; if(dfs(0)==-1)cout<<"NOT "; cout<<"BICOLORABLE."<<endl; } return 0; }