ACM模板——二分图

biGraph()若返回0,则不能构成二分图,返回1则能。color数组里装的是每个节点的颜色,1是黑,-1是白,0代表还没有赋值颜色。

 1 #define pb push_back
 2 #define _for(i,a,b) for(int i = (a);i < (b);i ++)
 3 const int maxn = 50003; 
 4 
 5 vector<int> G[maxn];
 6 int V;
 7 int color[maxn];
 8 bool dfs(int v,int c)
 9 {
10     //给当前节点颜色,1或-1 
11     color[v] = c;
12     //检查每个邻接节点,若不符合要求就return false 
13     for(int i = 0;i < G[v].size();i ++)
14     {
15         //如果邻接点和当前节点颜色重复 
16         if(color[G[v][i]] == c) return false;
17         //如果邻接点没有颜色但是继续向下的时候出现问题 
18         if(color[G[v][i]] == 0 && !dfs(G[v][i],-c)) return false;
19     }
20     return true;
21 }
22 int biGraph()
23 {
24     memset(color,0,sizeof(color));
25     //遍历每个节点 
26     for(int i = 0;i < V;i ++)
27         if(color[i]==0)
28             if(!dfs(i,1))
29                 return 0;
30     return 1;
31 }
二分图

 

posted @ 2019-03-08 07:27  Asurudo  阅读(401)  评论(0编辑  收藏  举报