欧拉路径Hrbust1351

http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1351

这道题先利用并查集的知识点,把输入的数据连结起来,形成一个树,然后再逐个结点判断。如果所有的结点都能相连,那么这是一个连通的路径,否则直接跳出,输出。否则记录结点的度的个数,逐个检查。

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<string.h>
 4 #include<iostream>
 5 using namespace std;
 6 int fa[20005],a[105];
 7 int fin(int x)//查找两个结点是否出自同一个父亲节点
 8 {
 9     return fa[x]==x?fa[x]:fa[x]=fin(fa[x]);
10 }
11 int unin(int x,int y)//将有关联两个节点连结在一起
12 {
13     return fa[fin(y)]=fin(x);
14 }
15 int main()
16 {
17 
18     int m,n;
19     while(cin>>m>>n){
20     memset(a,0,sizeof(a));
21     memset(fa,0,sizeof(fa));
22     for(int i=1;i<=m;i++){
23         fa[i]=i;/初始化父亲节点
24     }
25     int x;int y;
26     for(int i=1;i<=n;i++){
27         cin>>x>>y;
28         if(fin(x)!=fin(y)){//如果两个节点还没有出自同一个结点,那么
29             unin(x,y);//吧这两个节点连结在一起
30         }
31         a[x]++;//同时记录结点的度数
32         a[y]++;//同时记录结点的度数
33     }
34     int sum1=0;
35     for(int i=1;i<=m;i++){
36         if(a[i]%2!=0){
37             sum1++;
38         }
39         
40     }
41     int flag=0;
42     for(int i=1;i<=m;i++){
43         if(fin(i)!=fin(1)){//如果结点并不是相连续的,那么
44             flag=1;//记录flag的值
45             break;//跳出
46         }
47     }
48      if(flag==1)
49         {
50             printf("Graph is not connected!
");
51             continue;
52         }
53         if(sum1==2)
54         {
55             printf("have Euler path
");
56         }
57         else if(sum1==0)
58         {
59             printf("have Euler Circuit
");
60         }
61         else
62         {
63             printf("have no Euler path
");
64         }
65 
66     }
67     return 0;
68 }
69  
70 
71 
72  
73  
74  
View Code
你若盛开,清风自来...
原文地址:https://www.cnblogs.com/shangjindexiaoqingnian/p/5816110.html