题目1027:欧拉回路
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:3620
解决:1847
- 题目描述:
-
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
- 输入:
-
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结束。
- 输出:
-
每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。
- 样例输入:
-
3 3 1 2 1 3 2 3 3 2 1 2 2 3 0
- 样例输出:
-
1 0
- 来源:
- 2008年浙江大学计算机及软件工程研究生机试真题
- 开始考试的时候完全没有思路,考完后看了几篇网上的博客后才写出来的,我的总结如下
- 首先,欧拉图的意思是指每条边恰好只走一次,并能回到出发点的路径。
- 此题为无向图
- 无向图的时候只要每个顶点的度数都是偶数,就存在欧拉回路。
- 有向图(所有边都是单向的)的时候需要每个节顶点的入度都等于出度,就存在欧拉回路。
-
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int main() { int n,m; while(cin >> n&&n) { if(n==0) break; int m; scanf("%d",&m); int d[1010]; memset(d,0,sizeof(d)); while(m--) { int a,b; cin >> a >> b; d[a]++,d[b]++; } int flag=0; for(int i=1;i<=n;i++) { if(d[i]%2!=0)//若入度加出度有为奇数的则不存在欧拉回路 flag=1; } if(flag) printf("0 "); else printf("1 "); } return 0; }