标签:
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