熟识的人没边,不熟识的连边,连边的要属于两个不同集合。
WA的原因是最后的图可能是多个连通图,不能只把1入队,要遍历,如果没被染色就要入队。
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
#define N 100+5
bool g[N][N], visit[N];
int pa[N];
int n;
queue<int> q;
bool bfs(int i)
{
while (!q.empty()) q.pop();
q.push(i);
pa[i]=1;
visit[i]=true;
while (!q.empty()) {
int r=q.front();
q.pop();
for (int i=1;i<=n;i++){
if (i==r) continue;
if ((!g[r][i]) || (!g[i][r])) {
if (!pa[i]) {
pa[i]=3-pa[r];
q.push(i);
visit[i]=true;
}
else if (pa[r]==pa[i]) {
return false;
}
}
}
}
return true;
}
int main()
{
freopen("1.in","r",stdin);
while (scanf("%d",&n)!=EOF) {
memset(g,false,sizeof(g));
memset(pa,0,sizeof(pa));
memset(visit,false,sizeof(visit));
int i=1;
while (i<=n){
int j;
while (scanf("%d",&j)!=EOF && j) {
g[i][j]=true;
}
i++;
}
int ans=1;
for (i=1;i<=n;i++)
if (!pa[i])
if (!bfs(i)) ans=0;
if (ans) printf("YES\n");
else printf("NO\n");
}
return 0;
}