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("*****\n"); 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\n"); 115 else printf("NO\n"); 116 } 117 return 0; 118 }