#include <iostream>
#include <cstdio>
#include <cmath>
#include <string.h>
#include <queue>
#include <stack>
#include <algorithm>
#include <fstream>
#define ll long long
#define INF 0x3f3f3f3f
#define clr(x) memset(x,0,sizeof(x))
#define clr2(x) memset(x,INF,sizeof(x))
#define clr3(x) memset(x,-INF,sizeof(x))
#define clr4(x) memset(x,-1,sizeof(x))
#define pb(x) push_back(x)
//#define debug
using namespace std;
const ll mod=1e9+7;
struct Edge
{
int to,next;
} edge[233333];
struct E
{
int u,v;
}ed[23333];
bool flag;
int head[233333],cnt=0,n,m,x,y,deg[23333];
vector<int> vec1,vec0;
int c[12345];
void init()
{
cnt=0;
clr4(head);
clr4(c);
clr(deg);
vec1.clear();
vec0.clear();
}
void add(int u,int v)
{
edge[cnt].to=v;
edge[cnt].next=head[u];
head[u]=cnt++;
}
void dfs(int u,int fa,int color)
{
for (int i=head[u]; ~i; i=edge[i].next)
{
int v=edge[i].to;
if (v==fa) continue;
if (c[v]==color)
{
flag=false;
break;
}
if (c[v]==-1) c[v]=1-color,dfs(v,u,1-color);
}
}
int u,v,t;
int main()
{
#ifdef debug
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
while (scanf("%d%d%d%d",&n,&m,&x,&y)!=EOF)
{
flag=true;
init();
for (int i=1; i<=m; i++)
{
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
deg[u]++;
deg[v]++;
}
int st0=0,st1=0;
for (int i=1; i<=x; i++)
{
scanf("%d",&t);
c[t]=1;
vec1.pb(t);
}
for (int i=1; i<=y; i++)
{
scanf("%d",&t);
c[t]=0;
vec0.pb(t);
}
for (int i=0;i<vec1.size();i++)
if (deg[vec1[i]])
dfs(vec1[i],-1,1);
for (int i=0;i<vec0.size();i++)
if (deg[vec0[i]])
dfs(vec0[i],-1,0);
for (int i=1;i<=n;i++)
if (c[i]==-1)
{
if (deg[i]==0)
{
flag=false;
break;
}
else
dfs(i,-1,0);
}
if (flag )
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
hdu 5971
最新推荐文章于 2018-10-20 17:36:02 发布