hdu 4751 2013南京赛区网络赛 二分图判断 **

和以前做过的一个二分图颇为相似,以前的是互相不认识的放在一组,这个是互相认识的,本质上是相同的

hdu 2444

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<algorithm>
  4 #include<cstring>
  5 #include<cmath>
  6 #include<queue>
  7 #include<map>
  8 using namespace std;
  9 typedef long long ll;
 10 #define cl(a) memset(a,0,sizeof(a))
 11 #define ts printf("*****
");
 12 #define MAXN 202
 13 vector<int>EV[MAXN];
 14 int linker[MAXN];
 15 bool used[MAXN];
 16 int uN;
 17 int matchs[MAXN],cnt[MAXN];
 18 bool dfs(int u)
 19 {
 20     int i;
 21     for(i=0;i<EV[u].size();i++)
 22     {
 23         int v=EV[u][i];
 24         if(!used[v])
 25         {
 26             used[v]=true;
 27             if(linker[v]==-1||dfs(linker[v]))
 28             {
 29                 linker[v]=u;
 30                 return true;
 31             }
 32         }
 33     }
 34     return false;
 35 }
 36 int hungary()
 37 {
 38     int res=0;
 39     int u;
 40     memset(linker,-1,sizeof(linker));
 41     for(u=1;u<=uN;u++)
 42     {
 43         memset(used,false,sizeof(used));
 44         if(dfs(u))  res++;
 45     }
 46     return res;
 47 }
 48 bool judge(int x,int y)     //交叉染色法判断二分图
 49 {
 50     int i;
 51     for(i=0;i<EV[x].size();i++)
 52     {
 53         if(cnt[EV[x][i]]==0)
 54         {
 55             cnt[EV[x][i]]=-1*y;
 56             matchs[EV[x][i]]=true;
 57             if(!judge(EV[x][i],-1*y)) return false;
 58         }
 59         else if(cnt[EV[x][i]]==y)  return false;
 60     }
 61     return true;
 62 }
 63 bool matched()
 64 {
 65     int i;
 66     memset(matchs,false,sizeof(matchs));
 67     for(i=1;i<=uN;i++)
 68     {
 69         if(EV[i].size()&&!matchs[i])
 70         {
 71             memset(cnt,0,sizeof(cnt));
 72             cnt[i]=-1;
 73             matchs[i]=true;
 74             if(!judge(i,-1)) return false;
 75         }
 76     }
 77     return true;
 78 }
 79 int g[MAXN][MAXN];
 80 int main()
 81 {
 82     int m,n;
 83     int i,j;
 84     int u,v;
 85     #ifndef ONLINE_JUDGE
 86     freopen("1.in","r",stdin);
 87     #endif
 88     while(scanf("%d",&uN)!=EOF)
 89     {
 90         n=uN;
 91         for(i=1;i<=uN;i++)
 92           if(EV[i].size())  EV[i].clear();
 93         cl(g);
 94         int id;
 95         for(i=1;i<=n;i++)
 96         {
 97             while(scanf("%d",&id)!=EOF&&id)
 98             {
 99                 g[i][id]=1;
100             }
101         }
102         for(i=1;i<=n;i++)
103         {
104             for(j=i+1;j<=n;j++)
105             {
106                 if(!g[i][j]||!g[j][i])
107                 {
108                     EV[i].push_back(j);
109                     EV[j].push_back(i);
110                 }
111             }
112         }
113          if(matched())
114                   printf("YES
");
115          else  printf("NO
");
116     }
117     return 0;
118 }
原文地址:https://www.cnblogs.com/cnblogs321114287/p/4774372.html