hdu 4751 Divide Groups bfs (2013 ACM/ICPC Asia Regional Nanjing Online 1004)

来源:互联网 发布:淘宝换货流程明细 编辑:程序博客网 时间:2024/06/06 14:25

出处:http://blog.csdn.net/a601025382s/article/details/11873627


[cpp] view plaincopyprint?
  1. #include <cstdio>  
  2. #include <cstring>  
  3. #include <cmath>  
  4. #include <vector>  
  5. #include <queue>  
  6. #include <algorithm>  
  7. #include <iostream>  
  8. using namespace std;  
  9. const int maxn=110;  
  10. int e[maxn][maxn];  
  11. int vis[maxn],n;  
  12. int bfs(int x)//从x点开始分组。   
  13. {  
  14.     queue<int>q;  
  15.     q.push(x);  
  16.     vis[x]=1;  
  17.     int i,j,k,u,v;  
  18.     while(!q.empty())  
  19.     {  
  20.         u=q.front();  
  21.         q.pop();  
  22.         for(i=1;i<=n;i++)  
  23.         {  
  24.             if(e[u][i]==1||u==i)continue;  
  25.             if(vis[i]==-1)  
  26.             {  
  27.                 vis[i]=1-vis[u];  
  28.                 q.push(i);  
  29.             }  
  30.             else if(vis[i]==vis[u])return 0;  
  31.         }  
  32.     }  
  33.     return 1;  
  34. }  
  35. int main()  
  36. {  
  37.     while(cin>>n)  
  38.     {  
  39.         int i,j,k,a;  
  40.         memset(e,0,sizeof(e));  
  41.         memset(vis,-1,sizeof(vis));  
  42.         for(i=1;i<=n;i++)  
  43.         {  
  44.             while(cin>>a&&a!=0)  
  45.             e[i][a]=1;  
  46.         }  
  47.         //改成无向图   
  48.         for(i=1;i<=n;i++)  
  49.             for(j=1;j<=n;j++)  
  50.                 if(!e[i][j])e[j][i]=0;  
  51.         for(i=1;i<=n;i++)  
  52.         {  
  53.             if(vis[i]!=-1)continue;  
  54.             if(!bfs(i))break;  
  55.         }  
  56.         if(i<=n)cout<<"NO"<<endl;  
  57.         else cout<<"YES"<<endl;  
  58.     }  
  59.     return 0;  
  60. }  
  61. /* 
  62.     题意:将n个人分成两组,使得每组中的每个人都认识剩余所有人。 
  63.     用二维数组e记录关系,e[i][j]==0表示i不认识j。 
  64.     vis[i]表示组别,分别为1和0。则可知若e[i][j]==0 ,则i和j必定是一个是0,一个是1。 
  65. bfs一遍,当出现矛盾的时候就不能分组。 
  66.     由于枚举所有点作起点,且起点为1组内。又e[i][j]=0,e[j][i]=1和e[i][j]=e[j][i]=0情况相同。 
  67. 为避免起点为1造成的初始化错误,所以讲有向不认识图,改成无向图。例:不认识关系:3->1->2->4, 
  68. 开始枚举1,则vis[1]=1,vis[2]=0,vis[4]=1,后枚举3,vis[3]=1,vis[1]=0,矛盾,可情况是能分成(3,2)和(1,4)的。  
  69. */  

原创粉丝点击