hdu 3478 Catch--二分图判断
我觉得,给了初始点的话用bfs方便点,没有则dfs ||可能超片面
https://vjudge.net/contest/281085?tdsourcetag=s_pcqq_aiomsg#problem/C
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<iostream> 5 #include<stdlib.h> 6 #include<algorithm> 7 #include<queue> 8 #include<vector> 9 #include<string> 10 #include<set> 11 #include<cctype> 12 #include<sstream> 13 #define mem(a) memset(a,0,sizeof(a)) 14 #define LL long long 15 #define inf 0x3f3f3f3f 16 using namespace std; 17 const int N=1e5+10; 18 int color[N],fa[N]; 19 int n,m,now; 20 vector<int> link[N]; 21 queue<int> q; 22 int bfs() 23 { 24 memset(color,-1,sizeof(color)); 25 color[now]=1; 26 while(!q.empty()) 27 { 28 int k=q.front(); 29 q.pop(); 30 for(size_t i=0;i<link[k].size();i++) 31 { 32 int t=link[k][i]; //表示定点k通过i边连接的点 33 if(color[t]==color[k]) //染色是否相同 34 return 1; 35 if(color[t]==-1) 36 { 37 q.push(t); 38 color[t]=1-color[k];//1||0 39 } 40 } 41 } 42 return 0; 43 } 44 int main() 45 { 46 int a,b,t; 47 scanf("%d",&t); 48 for(int i=1;i<=t;i++) 49 { 50 scanf("%d%d%d",&n,&m,&now); 51 52 for(int j=0;j<n;j++) 53 link[j].clear(); 54 55 for(int j=0;j<m;j++) 56 { 57 scanf("%d %d",&a,&b); 58 link[a].push_back(b); 59 link[b].push_back(a); 60 } 61 62 while(!q.empty()) 63 q.pop(); 64 65 q.push(now); 66 67 if(!bfs()) //不是二分图,输出yes 68 printf("Case %d: NO\n",i); 69 else 70 printf("Case %d: YES\n",i); 71 } 72 return 0; 73 }