标签:
http://acm.hdu.edu.cn/showproblem.php?pid=4751
3 3 0 1 0 1 2 0
YES
/** hdu 4751 染色法二分图的判断 题目大意:给定一个些人物关系问是否能把所有的人分成两组,使得每一组的人都相互认识 解题思路:任意两个人如果不是相互认识就建边,然后采用染色的方法判断是否为二分图即可 */ #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; const int maxn=105; struct note { int v,next; }edge[maxn*maxn]; int head[maxn],ip; int color[maxn]; void init() { memset(head,-1,sizeof(head)); ip=0; } void addedge(int u,int v) { edge[ip].v=v,edge[ip].next=head[u],head[u]=ip++; } bool dfs(int u,int col) { color[u]=col; for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].v; if(color[v]!=-1) { if(color[v]==col)return false; continue; } if(!dfs(v,!col))return false; } return true; } int n; int g[105][105]; int main() { while(~scanf("%d",&n)) { memset(g,0,sizeof(g)); for(int i=1;i<=n;i++) { int x; while(~scanf("%d",&x)) { if(x==0) break; g[i][x]=1; } } init(); for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) { if(g[i][j]==0||g[j][i]==0) { addedge(i,j); addedge(j,i); } } } memset(color,-1,sizeof(color)); bool flag=true; for(int i=1;i<=n;i++) { if(color[i]==-1&&dfs(i,0)==false) { flag=false; break; } } if(flag) printf("YES\n"); else printf("NO\n"); } return 0; }
标签:
原文地址:http://blog.csdn.net/lvshubao1314/article/details/44158463