给出n个人,以及相互之间的关系。问能否分成两组,使得组内的人两两都互相认识。
一个人拆为两个点,对于不相互认识的两个人之间连一条边,表示该两人不能分在同一组,然后判断是不是二分图就好了。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
bool Map[105][105],r[105][105];
int n,color[105];
bool bi(int u){
for(int i=1;i<=n;++i){
if(Map[u][i]){
if(!color[i]) {
color[i]=3-color[u];
if(!bi(i)) return 0;
}else if(color[i]==color[u]) return 0;
}
}
return 1;
}
int main()
{
int i,j,k;
while(~scanf("%d",&n))
{
memset(Map,0,sizeof(Map));
memset(r,0,sizeof(r));
memset(color,0,sizeof(color));
for(i=1;i<=n;++i)
while(scanf("%d",&k)&&k)
r[i][k]=1;
for(i=1;i<=n;++i)
for(j=i+1;j<=n;++j)
if(!r[i][j]||!r[j][i]) Map[i][j]=Map[j][i]=1;
bool flag=1;
for(i=1;i<=n&&flag;++i)
if(!color[i]) {
color[i]=1;
if(!bi(i)) flag=0;
}
if(flag) puts("YES");
else puts("NO");
}
return 0;
}