九度 题目1027:欧拉回路

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

原文地址:https://www.cnblogs.com/hpuwangjunling/p/2998634.html