#include<iostream>#include<cstring>#include<cmath>#include<cstdio>#include<cstdlib>#define mt(a,b) memset(a,b,sizeof(a))#define LL long longusing namespace std;const int M = 200020;struct G { struct E { int u,v,next; } e[M*2]; int head[M],le; void init() { le = 0; mt(head,-1); } void add(int u,int v) { e[le].u = u; e[le].v = v; e[le].next = head[u]; head[u] = le++; }} g;class UnionFindSet { int par[M];public: void init() { mt(par,-1); } int getroot(int x) { int i=x,j=x,temp; while(par[i]>=0) i=par[i]; while(j!=i) { temp=par[j]; par[j]=i; j=temp; } return i; } bool unite(int x,int y) { int p=getroot(x); int q=getroot(y); if(p==q)return false; if(par[p]>par[q]) { par[q]+=par[p]; par[p]=q; } else { par[p]+=par[q]; par[q]=p; } return true; }} ts;bool mark[100020];int viwer[100020];int main() { int _; scanf("%d",&_); int n,m,k,l; while(_--) { scanf("%d%d%d",&n,&m,&k); mt(mark,false); int tmp; for(int i=0; i<k; i++) { scanf("%d",&tmp); mark[tmp] = true; } g.init(); for(int i=0; i<m; i++) { int u,v; scanf("%d%d",&u,&v); g.add(u,v); g.add(v,u); } scanf("%d",&l); for(int i=0;i<l;i++){ scanf("%d",&viwer[i]); } if(k!=l) { puts("No"); continue; } ts.init(); for(int x=1; x<=n; x++) { if(!mark[x]) { for(int i=g.head[x]; ~i; i=g.e[i].next) { int u = g.e[i].u; int v = g.e[i].v; ts.unite(u,v); } } } bool ans = true; for(int x=0; x<k; x++) { int u = viwer[x]; mark[u] = false; for(int i=g.head[u]; ~i; i=g.e[i].next) { int v = g.e[i].v; if(!mark[v]) ts.unite(u,v); } if(x>0){ if(ts.getroot(viwer[x-1]) != ts.getroot(u)){ ans = false; break; } } } if(ans){ int num = 0; for(int i=1;i<=n;i++){ if(ts.getroot(i)==i) num++; } if(num>1){ ans = false; } } if(ans) puts("Yes"); else puts("No"); } return 0;}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)