题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1272
Time Limit: 2000/1000 MS
(Java/Others) Memory Limit: 65536/32768 K
(Java/Others)
Total Submission(s):
22383 Accepted Submission(s):
6841
1 #include<iostream> 2 #include<stdio.h> 3 #include<string> 4 #include<string.h> 5 #include<map> 6 #include<math.h> 7 #define Max(x,y) x>y?x:y 8 #define N 100005 9 using namespace std; 10 int vy[N]; 11 int ux[N]; 12 int parent[N]; 13 int flag[N]; // 标记已经访问过的点 14 int Find(int x) 15 { 16 if(x== parent[x]) return x; 17 parent[x]= Find(parent[x]); 18 return parent[x]; 19 } 20 void Union(int x, int y) 21 { 22 int xf=Find(x); 23 int yf=Find(y); 24 parent[xf]=yf; 25 } 26 int main() 27 { 28 int x,y,i,j,len,title; 29 int maxtmp; 30 while(scanf("%d%d",&x,&y)!=EOF && x!= -1 &&y!=-1) 31 { 32 i=j=0; 33 title=0; 34 maxtmp=0; 35 ux[0]=x; 36 vy[0]=y; 37 if(x==0 && y==0){ 38 printf("Yes\n"); 39 continue; 40 } 41 memset(flag,0,sizeof(flag)); 42 flag[x]=flag[y]=1; 43 maxtmp=Max(maxtmp,x); 44 maxtmp=Max(maxtmp,y); 45 while(scanf("%d%d",&x,&y)!=EOF && x && y) 46 { 47 48 ux[++i]=x; 49 vy[++j]=y; 50 flag[x]=flag[y]=1; 51 maxtmp=Max(maxtmp,x); 52 maxtmp=Max(maxtmp,y); 53 } 54 55 len=i+1; 56 for( i=1;i<=maxtmp;i++) //初始化 57 { 58 parent[i]=i; 59 } 60 for( i=0;i<len;i++) 61 { 62 if(Find(ux[i]) != Find(vy[i])) //查找 63 { 64 Union(ux[i],vy[i]); //合并 65 } 66 else 67 title=1; // 表示根节点相同,形成回路 68 } 69 if(title==1){ 70 printf("No\n"); 71 continue; 72 } 73 for(i=1;i<=maxtmp;i++) 74 { 75 if(flag[i] && Find(i)==i ) 76 title++; // 表示根节点的个数,只有1个就ok, 否则有多个连通分量 77 } 78 if(title == 1) 79 printf("Yes\n"); 80 else printf("No\n"); 81 } 82 return 0 ; 83 }
二: 通过判断 顶点个数 = 边数+1
#include<iostream> #include<stdio.h> #include<string> #include<string.h> #include<map> #include<math.h> #define Max(x,y) x>y?x:y #define N 100005 using namespace std; int vy[N]; int ux[N]; int parent[N]; int flag[N]; // 标记已经访问过的点 int Find(int x) { if(x== parent[x]) return x; parent[x]= Find(parent[x]); return parent[x]; } void Union(int x, int y) { int xf=Find(x); int yf=Find(y); parent[xf]=yf; } int main() { int x,y,i,j,len,title; int maxtmp; while(scanf("%d%d",&x,&y)!=EOF && x!= -1 &&y!=-1) { i=j=0; title=0; maxtmp=0; int total=0; ux[0]=x; vy[0]=y; if(x==0 && y==0){ printf("Yes\n"); continue; } memset(flag,0,sizeof(flag)); flag[x]=flag[y]=1; maxtmp=Max(maxtmp,x); maxtmp=Max(maxtmp,y); while(scanf("%d%d",&x,&y)!=EOF && x && y) { ux[++i]=x; vy[++j]=y; flag[x]=flag[y]=1; maxtmp=Max(maxtmp,x); maxtmp=Max(maxtmp,y); } len=i+1; for( i=1;i<=maxtmp;i++) //初始化 { parent[i]=i; } for( i=0;i<len;i++) { if(Find(ux[i]) != Find(vy[i])) //查找 { Union(ux[i],vy[i]); //合并 total++; // 记录 边的个数 } else title=1; // 表示根节点相同,形成回路 } if(title==1){ printf("No\n"); continue; } for(i=1;i<=maxtmp;i++) { if(flag[i] ) title++; // 记录顶点个数 } if(title == total+1) printf("Yes\n"); else printf("No\n"); } return 0 ; }
原文:http://www.cnblogs.com/zn505119020/p/3580556.html