欧拉回路

来源:互联网 发布:张本天杰 知乎 编辑:程序博客网 时间:2024/06/05 15:58
D
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Submit

Status

Practice

HDU 1878
Description
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
Input
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结
束。
Output
每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。
Sample Input
3 3
1 2
1 3
2 3
3 2
1 2
2 3
0
Sample Output
1

0

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int in[1010];int fu[1010];int n,m;int findroot(int x){while(x!=fu[x])x=fu[x];return fu[x];}void Union(int x,int y){int fx=findroot(x);int fy=findroot(y);if(fx!=fy)fu[fx]=fy;}void init(){for(int i=1;i<=n;i++){fu[i]=i;}}int main(){while(scanf("%d",&n),n){init();int cont=0,flag=0;memset(in,0,sizeof(in));scanf("%d",&m);while(m--){int a,b;scanf("%d%d",&a,&b);Union(a,b);in[a]++;//记录入度(欧拉回路要求联通并且每个节点的入度都为偶数) in[b]++;}for(int i=1;i<=n;i++){if(fu[i]==i)cont++;}for(int i=1;i<=n;i++){if(in[i]%2!=0){flag=1;break;}}//if(cont!=1)//flag=1;if(flag==0&&cont==1)printf("1\n");elseprintf("0\n");}return 0;}//DDDDDDDDDDD


0 0
原创粉丝点击