题目1027:欧拉回路
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:1566
解决:758
- 题目描述:
-
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
- 输入:
-
测试输入包含若干测试用例。每个测试用例的第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
来源:2008年浙江大学计算机及软件工程研究生机试真题#include<iostream>
#include<cstdio>
#include<stdlib.h>
#include<malloc.h>
using namespace std;
typedef struct node{
int id;
struct node *link;
}node;int d[1003];
int flag[1003];
node v[1003];void add_edge(int x, int y)//构建无向图的邻接表
{
node *p = (node *)malloc(sizeof(node));//new node;
p->id=x;
p->link=v[y].link;
v[y].link=p;
node *q=(node *)malloc(sizeof(node));//new node;
q->id=y;
q->link=v[x].link;
v[x].link=q;
}
void dfs(int f)
{
node *temp;
flag[f]=1;
temp=v[f].link;
while(temp!=NULL)
{
if(!flag[temp->id])
dfs(temp->id);
temp=temp->link ;
}
}
int main()
{
int n,m,i,a,b,k,count;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0)
break;
k=1;
count=0;
for(i=0; i<=n; i++)
{
v[i].id=i;
v[i].link=NULL;
flag[i]=d[i]=0;
}
for(i=0; i<m; i++)
{
scanf("%d%d",&a,&b);
add_edge(a,b);
d[a]++;
d[b]++;
}
dfs(1);
for(i=1; i<=n; i++)
{
if(flag[i]==0)
k=0;
if(d[i]&1)
count++ ;
}
//cout<<k<<count<<endl;
if(k==1&&count==0)
printf("1\n");
else printf("0\n");
}
return 0;
}