题意:将n个人分到两个集合中,要求每个集合中的人都相互认识
思路:就是判断是不是二分图,对于一个人来说,如果另一个人和我不是相互认识的,那么他肯定是另一个集合中的人,按照这个分配出现矛盾则不能分配成功
#include <queue>
#include <vector>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int maxn=110;
int num[maxn][maxn],cnt[maxn];
bool judge(int n,int x){
queue<int>que;
que.push(x);
while(!que.empty()){
int c=que.front();que.pop();
for(int i=1;i<=n;i++){
if(i==c||(num[i][c]&&num[c][i])) continue;//如果是相互认识的可以在任意一方
else if(cnt[i]==0){//不认识的就要去另一阵营
if(cnt[c]==1) cnt[i]=2;
if(cnt[c]==2) cnt[i]=1;
que.push(i);
}else if(cnt[i]==cnt[c]) return 0;//不认识还在同一阵营,就不能成功
}
}
return 1;
}
int main(){
int n,a,b;
while(scanf("%d",&n)!=-1){
memset(num,0,sizeof(num));
memset(cnt,0,sizeof(cnt));
for(int i=1;i<=n;i++){
while(1){
scanf("%d",&a);
if(a==0) break;
num[i][a]=1;
}
}
int flag=0;
for(int i=1;i<=n;i++){
if(cnt[i]==0){
cnt[i]=1;//如果cnt[i]为0,说明我和之前所有人都认识,所以我现在去哪个阵营都可以,因为我都相互认识
if(judge(n,i)==0) flag=1;
}
}
if(flag) printf("NO\n");
else printf("YES\n");
}
return 0;
}