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 }