1128. Partition into Groups(图着色bfs)

1128

写的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\n",num);
116     for(i = 1; i <= n ; i++)
117     if(vis[i]==t)
118     printf("%d ",i);
119     puts("");
120     return 0;
121 }
View Code

 

 

posted @ 2013-10-17 22:49  _雨  阅读(361)  评论(0编辑  收藏  举报