3649: 欧拉回路
时间限制(普通/Java):1000MS/3000MS 内存限制:65536KByte
总提交:337 测试通过:156
总提交:337 测试通过:156
描述
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
输入
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结
束。
输出
每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。
样例输入
3 31 21 32 33 21 22 30
样例输出
10
题目来源
/*判断是否为欧拉函数需要满足两个条件: 1.为连通图 2.不存在度为奇数的点*/
#include <stdio.h>/*采用了c语言写法*/ int a[1000][1000],visited[1000]; int node; void Init(int n) { node=0; int i,j; for(i=1;i<=n;i++) { visited[i]=0; for(j=1;j<=n;j++) a[i][j]=0; } } void dfs(int n,int s) { visited[n]=1; node++; int i; for(i=1;i<=s;i++) { if(a[n][i]==1&&visited[i]==0) dfs(i,s); } return; } int num(int s) { int i,j,n,flag=1; for(i=1;i<=s;i++) { n=0; for(j=1;j<=s;j++) { n+=a[i][j]; } if(n%2==1) { flag=0; break; } } return flag; } int main() { int n,m,x,y; while(scanf("%d",&n),n) { Init(n); scanf("%d",&m); while(m--) { scanf("%d %d",&x,&y); a[x][y]=a[y][x]=1; } dfs(1,n); if(node==n&&num(n)) printf("1\n"); else printf("0\n"); } return 0; }