题目链接
2092: 欧拉回路
时间限制: 1 Sec 内存限制: 32 MB
提交: 6 解决: 5
[提交][状态][讨论版][命题人:外部导入]
题目描述
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
输入
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N <= 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结束。
输出
每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。
样例输入
3 3
2 3
1 2
1 3
3 2
1 2
2 3
0
样例输出
1
0
提示
图论的一个知识点:存在欧拉回路当且仅当图连通且不存在奇点(度数为奇数的顶点)。判断连通性我们可以使用深度优先搜索来完成。
思路:欧拉回路概念
显然需要先判断图的连通性,再...
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string.h>
#define in(x) scanf("%d",&x)
#define out(x) printf("%d\n",x)
using namespace std;
const int maxn=1e3+5;
int n,m;
int k[maxn];
int main()
{
int a,b,flag;
while(in(n),n){
flag=0;
in(m);
memset(k,0,sizeof(k));
for(int i=0;i<m;i++){
in(a),in(b);
k[a]++,k[b]++;
}
for(int i=1;i<=n;i++){
if(k[i]&1||k[i]==0){
flag=1;
break;
}
}
if(flag) out(0);
else out(1);
}
}