题意:能否将所有人分成最多2组使得每组人互相都认识
思路:2-sat问题
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int fst[300],next[40000],node[40000],en;
int n,m,a,b,c,ans,cnt,s[3000];
bool v[3000];
bool p[105][105];
void add(int x,int y)
{
next[++en]=fst[x];
fst[x]=en;
node[en]=y;
}
bool dfs(int x)
{
if(v[x^1])return false;
if(v[x])return true;
v[x]=1;
s[cnt++]=x;
for(int i=fst[x]; i!=-1; i=next[i])
{
if(!dfs(node[i]))return false;
}
return true;
}
int main()
{
int nb;
while(scanf("%d",&n)!=EOF)
{
en=0;
memset(fst,-1,sizeof(fst));
memset(p,0,sizeof(p));
for(int i=1;i<=n;i++)
{
while(scanf("%d",&nb))
{
if(nb==0)break;
p[i][nb]=1;
}
}
for(int i=1;i<n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(p[i][j]&&p[j][i])continue;
else
{
add(2*i,2*j+1);
add(2*i+1,2*j);
}
}
}
memset(v,0,sizeof(v));
ans=0;
for(int i=1; i<=n; i++)
{
if(!v[2*i]&&!v[2*i+1])
{
cnt=0;
if(!dfs(2*i))
{
while(cnt>0)v[s[--cnt]]=0;
if(!dfs(2*i+1))
{
ans=1;
break;
}
}
}
}
if(ans)cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
return 0;
}