Wrestling Match
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 116 Accepted Submission(s): 65
#include<cstdio>
#include<cstdlib>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<set>
#include<vector>
#include<map>
#define ms(x) memset( (x),0,sizeof(x) );
using namespace std;
typedef long long int ll;
map<int,int>mp;
vector<int>v[1009];
int sum,f;
void init(){
mp.clear();
for(int i = 0;i < 1009;i++) v[i].clear();
sum = f = 0;
}
void dfs(int n,int p){
if( f ) return;
for(int i = 0;i < v[n].size();i++){
if( mp[ v[n][i] ] == p ) {
f = 1;return;
}
if( mp[ v[n][i] ] == 0 ){
mp[ v[n][i] ] = -p,sum++;
dfs( v[n][i],-p );
}
}
}
int main()
{
// freopen("E:\\workspace\\acm---C++\\acm\\1.txt","r",stdin);
int n,m,x,y;
while( scanf("%d%d%d%d",&n,&m,&x,&y)!=EOF ){
init();
while(m--){
int a,b; scanf("%d%d",&a,&b);
v[a].push_back(b),v[b].push_back(a);
}
for(int i = 0;i < x;i++){
int a; scanf("%d",&a);
if( f ) continue;
if( mp[a] == -1 ) { f = 1;continue; }
if( mp[a] == 0 ) {
mp[a] = 1,sum++;
dfs(a,1);
}
}
for(int i = 0;i < y;i++){
int a; scanf("%d",&a);
if( f ) continue;
if( mp[a] == 1 ) { f = 1;continue; }
if( mp[a] == 0 ){
mp[a] = -1,sum++;
dfs(a,-1);
}
}
for(int i = 1;i <= n;i++){
if( mp[i] == 0 ){
if( v[ i ].size() == 0 ){ f = 1;break; }
mp[i] = 1,sum++;
dfs( mp[i],1 );
}
}
if( n==sum && f == 0 ) puts("YES");
else puts("NO");
}
return 0;
}