HDU 1878 欧拉回路【欧拉回路判定】
2012-03-16 00:34
218 查看
Problem 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
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
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
总结:如果图是联通的且全部点的度数为偶数,则能够形成欧拉回路。
code:
View Code#include<stdio.h> #include<string.h> #define num 1000 int n,m; int du[num],f[num]; int find(int x) { int r=x; while(r!=f[r]) r=f[r]; int i=x; int j; while(i!=r) { j=f[i]; f[i]=r; i=j; } return r; } void join(int x,int y) { int fx=find(x); int fy=find(y); if(fx!=fy) { if(fx<fy) f[fy]=fx; else f[fx]=fy; } } int main() { int p,q,flag,i; while(scanf("%d",&n),n) { memset(du,0,sizeof(du)); flag=0; for(i=1;i<=n;i++) f[i]=i; scanf("%d",&m); while(m--) { scanf("%d%d",&p,&q); join(p,q); du[p]++; du[q]++; } for(i=1;i<=n;i++) { if(du[i]&1) { flag=1; break; } else if(f[i]!=1) { flag=1; break; } } if(flag) printf("0\n"); else printf("1\n"); } return 0; }
相关文章推荐
- HDU-1878 欧拉回路判定
- HDU 1878 欧拉回路(简单欧拉回路判定)
- 【欧拉回路(无向图判定)】hdu 1878 欧拉回路
- 欧拉通路 欧拉回路的判定 Hdu 1878 欧拉回路
- 【HDU 1878】欧拉回路(并查集,欧拉回路概念及判定)
- HDU-1878 欧拉回路 判定是否存在欧拉回路
- HDU 1878 欧拉回路 Tarjan+欧拉判定
- hdu1878 欧拉回路
- hdu_1878_欧拉回路_并查集
- Hdu 1878 欧拉回路
- HDU 1878 欧拉回路
- 【HDU-1878】 欧拉回路
- HDU 1878 欧拉回路(入门)
- hdu 1878 欧拉回路
- HDU 1878 欧拉回路
- HDU 1878-欧拉回路(简单的欧拉回路判断)
- HDU1878-欧拉回路(入门题+并查集)
- HDU-1878-欧拉回路【并查集】
- hdu 1878 (欧拉回路)
- HDU 1878 无向图判欧拉回路