题解:先确定在n个人的序号里面,是good or bad 我用 1 和 -1 来区别。如果一个人确定为good 即为 1 则与他比赛的对手即为 bad -1.如此将所有
情况罗列出来。最后遍历一遍 per 数组。如果还有不确定的 人 即 输出 no 否则 为yes.
//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <fstream>
#include <cstring>
#include <cmath>
#include <algorithm>
#define N 100005
#define ll long long
#define mod 1000000007
using namespace std;
#define max 1009
#define Base 10000
#define MXM 109
#define MXN 10000005
#define pi 3.1415926
int p[max];
struct per
{
int x,y;
}a[10010];
int main()
{
freopen("in.txt","r",stdin);
//int a[max];
int n,m,ng,nb;
while(~scanf("%d%d%d%d",&n,&m,&ng,&nb))
{
int b,g;
int flag=1;
memset(p,0,sizeof p);
memset(a,0,sizeof a);
for (int i=1;i<=m;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
}
for (int i=1;i<=ng;i++)
{
scanf("%d",&g);
p[g]=1;
}
for (int i=1;i<=nb;i++)
{
scanf("%d",&b);
p[b]=-1;
}
for(int i=1;i<=m;i++)
{
if (!p[a[i].x]&&!p[a[i].y])
{
p[a[i].x]=1;
p[a[i].y]=-1;
continue;
}
else if(!p[a[i].x])
{
if (p[a[i].y]==1)
p[a[i].x]=-1;
else
p[a[i].x]=1;
continue;
}
else if (!p[a[i].y])
{
if (p[a[i].x]==-1)
p[a[i].y]=1;
else
p[a[i].y]=-1;
continue;
}
else if (p[a[i].x]==p[a[i].y])
{
flag=0;
break;
}
else
continue;
}
for (int i=1;i<=n;i++)
{
if (!p[i]) {
flag =0;
break;
}
}
if (!flag) cout << "NO"<<endl;
else
cout << "YES"<<endl;
}
}