首页 > 代码库 > HDU1272
HDU1272
题目链接:https://vjudge.net/problem/HDU-1272
题目分析:以前做过的一道并查集,今天翻到了就重新做一次。
注意点:1、当输入只有“ 0 0"时输出”Yes";
2、"有且仅有一条路径可以相通","有且仅有一条路径可以相通","有且仅有一条路径可以相通","有且仅有一条路径可以相通","有且仅有一条路径可以相通","有且仅有一条路径可以相通"......
3、输出是“Yes"和”No“不是”YES"和“NO”,输出是“Yes"和”No“不是”YES"和“NO”,输出是“Yes"和”No“不是”YES"和“NO”,输出是“Yes"和”No“不是”YES"和“NO”......
1 #include <cstdio> 2 #include <algorithm> 3 #include <set> 4 using namespace std; 5 const int maxn=100000+10; 6 int source[maxn]; 7 set<int>vis; 8 int node[maxn]; 9 int finds(int t){ 10 if(!source[t]) 11 return t; 12 source[t]=finds(source[t]); 13 return source[t]; 14 } 15 int main() 16 { 17 int a,b; 18 int yes; 19 while(scanf("%d%d",&a,&b)==2 && a>=0 && b>=0){ 20 if(!a || !b){ 21 printf("Yes\n"); 22 continue; 23 } 24 vis.insert(a); 25 vis.insert(b); 26 for(int i=1;i<maxn;i++){ 27 source[i]=0; 28 node[i]=1; 29 } 30 yes=1; 31 source[a]=b; 32 node[b]+=node[a]; 33 int maxx=node[b]; 34 35 while(scanf("%d%d",&a,&b)==2 && a){ 36 vis.insert(a); 37 vis.insert(b); 38 if(!yes) 39 continue; 40 int s1=finds(a); 41 int s2=finds(b); 42 if(s1==s2){ 43 yes=0; 44 continue; 45 } 46 source[s1]=s2; 47 node[s2]+=node[s1]; 48 maxx=max(node[s2],maxx); 49 } 50 if(yes && maxx==vis.size()) printf("Yes\n"); 51 else printf("No\n"); 52 vis.clear(); 53 } 54 return 0; 55 }
HDU1272
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。