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

 

 

你可能感兴趣的:(partition)