e[i][j]表示两个人认不认识
vis=1或0 表示分在哪个组
枚举所有点作为起点 分在1组内 然后bfs啦
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#define inf 0x3f3f3f3f
typedef __int64 ll;
using namespace std;
int n,e[110][110],vis[110];
int bfs(int x)
{
int i,u;
vis[x]=1;
queue<int>q;
q.push(x);
while(!q.empty())
{
u=q.front();
q.pop();
for(i=1;i<=n;i++)
{
if(!e[u][i]&&u!=i)//判断不认识的人是不是已经分组 如果分在一组就直接退出 否则分在另外一组
{
if(vis[i]==-1)
{
vis[i]=1-vis[u];
q.push(i);
}
else if(vis[i]==vis[u]) return 0;
}
}
}
return 1;
}
int main()
{
int i,j,x;
while(~scanf("%d",&n))
{
memset(e,0,sizeof e);
memset(vis,-1,sizeof vis);
for(i=1;i<=n;i++)
{
while(scanf("%d",&x)&&x)
{
e[i][x]=1;
}
}
for(i=1;i<=n;i++)//改成无向图
{
for(j=1;j<=n;j++)
if(!e[i][j]) e[j][i]=0;
}
for(i=1;i<=n;i++)
{
if(vis[i]==-1&&!bfs(i))
{
printf("NO\n");
break;
}
}
if(i>n) printf("YES\n");
}
return 0;
}