首页 > 代码库 > 欧拉路径Hrbust1351
欧拉路径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!\n");51 continue;52 }53 if(sum1==2)54 {55 printf("have Euler path\n");56 }57 else if(sum1==0)58 {59 printf("have Euler Circuit\n");60 }61 else62 {63 printf("have no Euler path\n");64 }65 66 }67 return 0;68 }69 70 71 72 73 74
欧拉路径Hrbust1351
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。