Code

You might also like

Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 3

#include<cstdio>

#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
#include<set>
#include<cmath>
#include<bitset>
#include<assert.h>
#include<map>
#define test(t) while(t--)
#define cin(n) scanf("%d",&n)
#define cout(n) printf("%d\n",n)
#define rep(i,a,n) for(i=a;i<=n;i++)
#define vi vector<int>
#define vii vector< vector<int> >
#define vpii vector< pair<int,int> >
#define mii map<int,int>
#define pb push_back
#define imax (int) 1000000007
#define ill long long
#define gc getchar_unlocked
using namespace std;
#define MAXN 200009
#define mp make_pair
#define mod 1000000007
#define pb push_back
#define getchar_unlocked() getchar()
#define inp(x) fi(&x)
typedef long long int ll;
using namespace std;
ill powe(int aa,int b)
{
ill ans=1;
ill a=aa*1LL;
while(b)
{
if(b&1)
ans=(ans*1LL*a)%mod;
a=(a*1LL*a)%mod;
b=b/2;
}
return ans;
}
ill modinv(int a)
{
return powe(a,mod-2);
}

int par[maxn+9],rnk[maxn+9];
int fi(int x)
{
if(par[x]==x)
return x;
return par[x]=x;
}
void uni(int x,int y)
{
x=fi(x);
y=fi(y);
if(x==y)
return;
if(rnk[x]<=rnk[y])
{
if(rnk[x]==rnk[y])
rnk[y]++:
par[x]=y;
return;
}
par[y]=x;
return;
}
int main()
{
int t,m,n,i,j,k,l;

cin(n);cin(m);
cin(k);
cin(l);
vector<int>v;
vector<int>edges[n+9];
int vis[n+9];
for(i=1;i<=n;i++)
{
par[i]=i;
rnk[i]=1;
}
for(i=0;i<k;i++)
{
cin(j);
vis[j]=1;
}
for(i=0;i<m;i++)
{
int x,y;
cin(x);cin(y);
if(!vis[x]&&!vis[y])
{
uni(x,y);
continue;
}
edges[x].pb(y);
edges[y].pb(x);
}
for(i=0;i<l;i++)
{
cin(j);
v.pb(j);
vis[j]=1;
}
if(l!=k)
{
cout<<"No\n";
continue;
}
int fg=1;
for(i=0;i<l;i++)
{
int nd=v[i];
int x=edges[nd].size();
for(j=0;j<x;j++)
{
int q=edges[nd][j].second;
if(!vis[q]);
uni(p,q);
}
}
if(!i)
continue;
int p1,p2;
p1=fi(nd);
p2=fi(v[i-1);
if(p1!=p2)
{fg=0;break;}
}

}

You might also like