写的dfs貌似不太对 bfs重写
用bfs将图进行黑白染色 如果有超过一个与自己颜色相同的点 就把该点存入栈中 最后处理栈中的点 判断此点是否合法 不合法 取反 取反后再判断相邻点是否合法 不合法再存入栈中 直到栈为空
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<vector> 7 #include<queue> 8 using namespace std; 9 #define N 80010 10 vector<int>ed[N]; 11 int n; 12 int vis[N],d[N],f[N],g; 13 void bfs(int s) 14 { 15 int i; 16 queue<int>q; 17 q.push(s); 18 vis[s] = 1; 19 while(!q.empty()) 20 { 21 int u = q.front(); 22 q.pop(); 23 int k = vis[u]; 24 int num = 0; 25 for(i = 0 ; i < (int)ed[u].size() ;i++) 26 { 27 int v = ed[u][i]; 28 if(!vis[v]) 29 { 30 vis[v] = -k; 31 q.push(v); 32 } 33 else if(vis[v]!=-k) 34 { 35 num++; 36 } 37 } 38 if(num>1) 39 { 40 g++; 41 d[g] = u; 42 } 43 } 44 } 45 int main() 46 { 47 int m,i,j; 48 scanf("%d",&n); 49 for(i = 1; i <= n ; i++) 50 { 51 scanf("%d",&m); 52 for(j = 1 ; j <= m ; j++) 53 { 54 int a; 55 scanf("%d",&a); 56 ed[i].push_back(a); 57 } 58 } 59 for(i = 1; i <= n ; i++) 60 { 61 if(!vis[i]&&!f[i]) 62 { 63 bfs(i); 64 } 65 } 66 for(i = 1; i <= g ; i++) 67 { 68 int v = d[i],num=0; 69 for(j = 0 ; j < (int)ed[v].size() ; j++) 70 { 71 int x = ed[v][j]; 72 if(vis[x]==vis[v]) 73 num++; 74 } 75 if(num>1) 76 { 77 vis[v] = -vis[v]; 78 for(j = 0 ; j < (int)ed[v].size() ; j++) 79 { 80 int x = ed[v][j],oo=0; 81 for(int p = 0 ; p < (int)ed[x].size() ; p++) 82 if(vis[x]==vis[ed[x][p]]) 83 { 84 oo++; 85 } 86 if(oo>1) 87 { 88 g++; 89 d[g] = x; 90 } 91 } 92 } 93 } 94 int num = 0,o=-1,t; 95 for(i = 1; i <= n ; i++) 96 if(vis[i]==1) 97 { 98 if(i==1) 99 o = 1; 100 num++; 101 } 102 if(num<n-num) 103 { 104 t = 1; 105 } 106 else if(num==n-num) 107 { 108 t = o; 109 } 110 else 111 { 112 num = n-num; 113 t = -1; 114 } 115 printf("%d ",num); 116 for(i = 1; i <= n ; i++) 117 if(vis[i]==t) 118 printf("%d ",i); 119 puts(""); 120 return 0; 121 }