首页 > 代码库 > ZOJ 3811
ZOJ 3811
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5343
网络赛这水题没写过太伤了,赛后写了下1A。
当时钻牛角尖一定要用k次bfs,其实一次就够了,把扩展到的节点插入set中,复杂度nlogn
#include <iostream>#include <cstdio>#include <cstring>#include <set>#include <vector>#include <queue>using namespace std ;vector <int> mp[100005] ;set <int> s ;int idx[100005] ;int vis[100005] ;int node[100005] ;int find(int x){ return idx[x]==x?x:idx[x]=find(idx[x]) ;}int n,m,k ;int flag[100005] ;int main(){ int T ; scanf("%d",&T) ; while(T--) { scanf("%d%d%d",&n,&m,&k) ; memset(flag,0,sizeof(flag)) ; for(int i=0 ;i<100005 ;i++) mp[i].clear() ; s.clear() ; memset(vis,0,sizeof(vis)) ; for(int i=1 ;i<=n ;i++) idx[i]=i ; for(int i=0 ;i<k ;i++) { int x ; scanf("%d",&x) ; flag[x]=1 ; } int ff=1 ; while(m--) { int a,b ; scanf("%d%d",&a,&b) ; mp[a].push_back(b) ; mp[b].push_back(a) ; int p=find(a) ; int q=find(b) ; if(p!=q) idx[p]=q ; } for(int i=2 ;i<=n ;i++) { if(find(idx[1])!=find(idx[i])) { ff=0 ; break ; } } int L ; scanf("%d",&L) ; if(L!=k)ff=0 ; for(int i=0 ;i<L ;i++) scanf("%d",&node[i]) ; queue <int> q ; s.insert(node[0]) ; for(int j=0 ;j<L ;j++) { if(s.find(node[j])!=s.end()) { q.push(node[j]) ; vis[node[j]]=1 ; while(!q.empty()) { int u=q.front() ; q.pop() ; for(int i=0 ;i<mp[u].size() ;i++) { if(!vis[mp[u][i]]) { vis[mp[u][i]]=1 ; if(flag[mp[u][i]]) { s.insert(mp[u][i]) ; } else { q.push(mp[u][i]) ; } } } } continue ; } else { ff=0 ; break ; } } if(ff)puts("Yes") ; else puts("No") ; } return 0 ;}
ZOJ 3811
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。