hihocoder #1121 : 二分图一•二分图判定
二分图判断算法: 到此我们就得到了整个图的算法: 选取一个未染色的点u进行染色 遍历u的相邻节点v:若v未染色,则染色成与u不同的颜色,并对v重复第2步;若v已经染色,如果 u和v颜色相同,判定不可行退出遍历。 若所有节点均已染色,则判定可行。 注意:有个能存在多个不连通的子图 #include <cstdio> #include <cstring> #include <vector> using namespace std; const int N = 10010; vector<int>a[N]; int color[N]; bool dfs(int v) { //printf("%d\n",v); for(int i = 0; i < a[v].size(); i++) { int u = a[v][i]; if(color[u] == -1) { color[u] = 1-color[v]; dfs(u); } else if(color[u] == color[v]) { return false; } } return true; } int main() { int T; int n,m; scanf("%d",&T); while(T--) { scanf("%d %d",&n,&m); for(int i = 0; i < N; i++) color[i] = -1; for(int i = 0; i < N; i++) a[i].clear(); for(int i = 0; i < m; i++) { int u,v; scanf("%d %d",&u,&v); u--,v--; int flag = 0; for(int j = 0; j < a[u].size(); j++) if(a[u][j] == v) { flag= 1; break; } if(!flag && u!=v) { a[u].push_back(v); a[v].push_back(u); } } bool flag=true; for(int i = 0; i < n; i++) { if(color[i]!=-1) continue; color[i] = 1; flag = dfs(i); if(flag == false) break; } if(!flag) printf("Wrong\n"); else printf("Correct\n"); } return 0; }
posted on 2015-11-20 15:51 zyz913614263 阅读(157) 评论(0) 编辑 收藏 举报