/*这题后面那个visit的判断有点浪费时间。没有优化好。。后来看了飞神的解题报告,在DFS算法中进行优化
for(i=0; i<n; i++) { if(!color[i]&&map[x][i]) { color[i]=-color[x]; if(dfs(i,n)) return 1; else return 0; } else if(color[i]&&map[x][i]&&color[x]==color[i]) { return 0; } }
*/
#include<iostream> #include<memory.h> using namespace std; int m[210][210]; int color[210]; int n; void dfs(int x,int n) { int i; for(i=0;i<n;i++) { if(m[x][i]==1 && !color[i]) { color[i]=-color[x]; dfs(i,n); } } } int main() { int t,a,b,flag,i,j; while(cin>>n && n) { flag=0; memset(m,0,sizeof(m)); memset(color,0,sizeof(color)); cin>>t; while(t--) { cin>>a>>b; m[a][b]=1; m[b][a]=1; } for(i=0;i<n;i++) for(j=0;j<n;j++) if(j==n-1) cout<<m[i][j]<<endl; else cout<<m[i][j]<<" "; color[0]=1; dfs(0,n); for(i=0;i<n;i++) if(i==n-1) cout<<color[i]<<endl; else cout<<color[i]<<" "; for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(m[i][j]==1) { if(color[i]!=color[j]) continue; else { flag=1; break; } } } if(flag==1) break; } if(flag==1) cout<<"NOT BICOLORABLE."<<endl; else cout<<"BICOLORABLE."<<endl; } return 0; }
原文:http://blog.csdn.net/r_misaya/article/details/42155313