zoukankan      html  css  js  c++  java
  • 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
    ",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
  • 相关阅读:
    《有毒》读后感 读书笔记
    《自动时代》读后感 读书笔记
    HTML 中有用的字符实体
    input 光标在 chrome下不兼容 解决方案
    form注册表单圆角 demo
    横向导航二级菜单
    鼠标悬浮,下拉菜单,距离一定距离
    纵向折叠二级菜单(无限点击)
    纵向折叠二级菜单
    纵向导航二级弹出菜单
  • 原文地址:https://www.cnblogs.com/shangyu/p/3375196.html
Copyright © 2011-2022 走看看