标签:
二分图判定问题:
判定是否存在一个合理的染色方案,使得我们所建立的无向图满足每一条边两端的顶点颜色都不相同。
算法描述:
(1)选取一个未染色的节点u进行染色。
(2)遍历u的邻接点v:若v未染色,则将v染上与u不同的颜色并对v重复步骤(2);若v已经染色且颜色与u相同,则判定不可行并退出遍历。
(3)若所有节点都被染色,则判定可行。
代码实现:
1 #include <iostream> 2 #include <vector> 3 #include <cstring> 4 5 using namespace std; 6 7 #define MAXN 10005 8 9 vector<int> g[MAXN]; 10 int color[MAXN], n, m; 11 12 bool isBiGraph(int x, int co) 13 { 14 bool ret = true; 15 color[x] = co; 16 int sz = g[x].size(); 17 for(int i=0; i<sz; ++i) 18 { 19 int y = g[x][i]; 20 if(color[y]<0) 21 { 22 ret = ret&&isBiGraph(y, co^1); 23 if(!ret) return ret; 24 } 25 else if(color[y]==co) return false; 26 } 27 return ret; 28 } 29 30 void init() 31 { 32 for(int i=1; i<=n; ++i) g[i].clear(); 33 memset(color+1, -1, n*sizeof(int)); 34 } 35 36 int main() 37 { 38 int t; 39 cin>>t; 40 while(t--) 41 { 42 cin>>n>>m; 43 init(); 44 while(m--) 45 { 46 int u, v; 47 cin>>u>>v; 48 g[u].push_back(v); 49 g[v].push_back(u); 50 } 51 cout<<(isBiGraph(1, 0)?"Correct":"Wrong")<<endl; 52 } 53 return 0; 54 }
标签:
原文地址:http://www.cnblogs.com/pczhou/p/4297970.html