题目1027:欧拉回路
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:3738
解决:1918
-
题目描述:
-
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
-
输入:
-
测试输入包含若干测试用例。每个测试用例的第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
-
答疑:
- 解题遇到问题?分享解题心得?讨论本题请访问: http://t.jobdu.com/thread-7751-1-1.html
-
-
思路:
欧拉回路是指每条边恰好只走一次,并能回到出发点的路径。
我们如何判断一个图有欧拉回路?
一、无向图
每个顶点的度数都是偶数,则存在欧拉回路。
二、有向图(所有边都是单向的)
每个节顶点的入度都等于出度,则存在欧拉回路。
知道了这些,我们只要判断每个边的度数即可。
-
#include<iostream> #include<cstring> #include<fstream> using namespace std; int node[1001]; int main() { ifstream in; in.open("2.txt"); int n,m; while(in>>n && n!=0) { in>>m; int i,j,k; memset(node,0,sizeof(node)); for(i=1;i<=m;++i) { in>>j>>k; node[j]++; node[k]++; } for(i=1;i<=n;++i) { if(node[i]%2!=0)//节点的度应该是偶数,而不是2 { cout<<"0"<<endl; break; } } if(i==n+1) cout<<"1"<<endl; } return 0; }