题目链接:传送门
欧拉回路
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 14771 Accepted Submission(s): 5648
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
解题思路:简单的欧拉回路判断
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <queue>
#include <set>
#include <string>
#include <stack>
#include <algorithm>
#include <map>
using namespace std;
typedef __int64 ll;
const int N = 1005;
const int M = 50800;
const int INF = 0x3fffffff;
const int mod = 1e9+7;
const double Pi = acos(-1.0);
const double sm = 1e-9;
int rec[N],parent[N];
void merge( int a , int b )
{
int i,j;
for( i = a ; i != parent[i] ; i = parent[i] ) parent[i] = parent[parent[i]];
for( j = b ; j != parent[j] ; j = parent[j] ) parent[j] = parent[parent[j]];
if( i != j ) parent[i] = j;
}
int main()
{
int n,m;
while(1){
scanf("%d",&n);
fill( rec , rec+N , 0 );
for( int i = 1 ; i <= n ; ++i ) parent[i]=i;
if( n == 0 ) break;
scanf("%d",&m);
int a,b,tot=0,re=0;
for( int i = 0 ; i < m ; ++i ){
scanf("%d%d",&a,&b);
++rec[a];++rec[b];
merge(a,b);
}
for( int i = 1 ; i <= n ; ++i ){
if( parent[i] == i ) ++re;
}
for(int i = 1 ; i <= n ; ++i ){
if( rec[i]%2 != 0 ) ++tot;
}
if( tot == 0 && re == 1 ) printf("1\n");
else printf("0\n");
}
return 0;
}