http://www.cppblog.com/linyangfei/archive/2008/08/08/58295.html很详细了。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n;
int map[110][110];
int cmap[110][110];
int col[110];
int flag;
void dfs(int u,int c)
{
if(flag==0)
return ;
col[u]=c;
for(int i=1;i<=n;i++)
{
if(cmap[u][i]&&i!=u)
{
if(col[i]==-1)
{
dfs(i,(c+1)%2);
if(flag==0)
return ;
}
if(col[i]==col[u])
{
flag=0;
return;
}
}
}
}
int main()
{
int x;
while(~scanf("%d",&n))
{
memset(map,0,sizeof(map));
memset(cmap,0,sizeof(cmap));
memset(col,-1,sizeof(col));
for(int i=1;i<=n;i++)
{
while(scanf("%d",&x)&&x)
{
map[i][x]=1;
}
}
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
if(map[i][j]==0||map[j][i]==0)
cmap[i][j]=cmap[j][i]=1;
flag=1;
for(int i=1;i<=n&&flag;i++)
if(col[i]==-1)
dfs(i,0);
printf(flag?"YES\n":"NO\n");
}
return 0;
}