HDU 4751 Divide Groups(判断二分图)
2016-02-21 10:39
513 查看
大意:第I行有若干个数k,且以0作为结尾,含义是第I人和k认识,(但是k不一定认识I)。问能不能将相互认识的人分两组。
思路:就是判断二分图,建图是两个不相认识的人相连(不连接就是认识的)。
思路:就是判断二分图,建图是两个不相认识的人相连(不连接就是认识的)。
#include<map> #include<queue> #include<cmath> #include<iostream> #include<cstdio> #include<stack> #include<cstring> #include<algorithm> #define LL long long #define inf 0x3f3f3f3f const double PI=acos(-1.0); using namespace std; struct node{ int to,next; }q[50000]; int cnt,mp[500][500],head[50000],cro[50000],col[50000]; bool vis[50000]; void bu(int a,int b){ q[cnt].to=b; q[cnt].next=head[a]; head[a]=cnt++; } bool color(int x){ for(int i=head[x];~i;i=q[i].next){ int u=q[i].to; if(!col[u]){ col[u]=!col[x]; if(!color(u)) return false; } else if(col[x]==col[u]){ return false; } } return true; } int main(){ int n,m,i,j,k,a,b,ans; while(~scanf("%d",&n)){ cnt=ans=0; memset(mp,0,sizeof(mp)); memset(head,-1,sizeof(head)); for(i=1;i<=n;i++){ while(~scanf("%d",&k)&&k){ //bu(i,k); mp[i][k]=1; } } for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ if(i==j) continue;///注意自己不能和自己连边建图 if((!mp[i][j])){ bu(i,j);bu(j,i); } } } memset(col,0,sizeof(col)); bool p; for(i=1;i<=n;i++){///因为不能保证图的连通性所以每个点都要进行遍历 if(col[i]==0){ p=color(i); if(!p) break; } } if(!p) puts("NO"); else puts("YES"); } return 0; }
相关文章推荐
- Bad Horse - Practice Round China New Grad Test 2014 - BFS - 二分图判定
- hdu 1281 二分图匹配求匹配边以及增广链
- 二分图不带权匹配
- Codeforce 85E (二分答案+二分图染色)
- 无向图的最小边覆盖
- Hdu2063—过山车 二分图最大匹配
- Codeforces498C解题报告
- poj_3041
- uva 1201
- uva12083
- hdu 2255
- [Usaco2011 Nov]Cow Steeplechase奶牛越野跑(二分图裸题)
- hdu2603
- hdu4619
- 匈牙利算法
- POJ2446 CHESSBOARD
- POJ 2112 (二分图多重匹配)
- uva10004 Bicoloring 二分图染色
- poj 1325 最小顶点覆盖
- poj 2446 二分图最大匹配 匈牙利算法