解这题的关键是通过假设先判断,给出的关系中是否能够能够分陪选手危害坏选手,第二部判断已给出的好选手与假设的是否矛盾,若矛盾则假设的之相反,在进行已知坏选手的判断,若矛盾则输出NO;
#include<stdio.h>
#include<string.h>
int main()
{
int n,m,x,y,a[1005],c1,c2,c3,flag,flag2;
while(scanf("%d%d%d%d",&n,&m,&x,&y)!=EOF)
{
flag=0;
flag2=0;
memset(a,0,sizeof(a));
for(int i=0;i<m;i++)
{
scanf("%d%d",&c1,&c2);
if(a[c1]==0&&a[c2]==0) //通过假设看是否存在一种情况使他们为好坏选手
{
a[c1]=1;
a[c2]=2;
}
else if(a[c1]!=0||a[c2]!=0)
{
if(a[c1]==a[c2]) flag=1;
else if(a[c1]==1) a[c2]=2;
else if(a[c1]==2) a[c2]=1;
else if(a[c2]==1) a[c1]=2;
else if(a[c2]==2) a[c1]=1;
}
}
for(int i=0;i<x;i++) //看结果值是否与已知的有差异
{
scanf("%d",&c3);
if(a[c3]==0)
{
a[c3]=1;
continue;
}
else if(a[c3]==1) continue;
else flag2=1;
}
for(int i=0;i<y;i++) //再次验证
{
scanf("%d",&c3);
if(a[c3]==0)
{
a[c3]=2;
continue;
}
if(a[c3]==1&&flag2==1) continue;
else if(a[c3]==2&&flag2==0) continue;
else flag=1;
}
for(int i=1;i<=n;i++) //是否分为好坏选手了
{
if(a[i]==0) flag=1;
}
if(flag==1) printf("NO\n");
else printf("YES\n");
}
}