二分图判定

二分图判定问题:

判定是否存在一个合理的染色方案,使得我们所建立的无向图满足每一条边两端的顶点颜色都不相同

算法描述:

(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         bool ans = true;
52         for(int i=1; i<=n; ++i)
53             if(color[i]<0)  ans  = (ans&&isBiGraph(i, 0));
54         cout<<(ans?"Correct":"Wrong")<<endl;
55     }
56     return 0;
57 }

 

posted @ 2015-02-23 12:23  __brthls  阅读(199)  评论(0编辑  收藏  举报