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;
}