3649: 欧拉回路

3649: 欧拉回路分享至QQ空间

时间限制(普通/Java):1000MS/3000MS     内存限制:65536KByte
总提交: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

题目来源

浙大计算机研究生复试上机考试-2008年

/*判断是否为欧拉函数需要满足两个条件:
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;
}


猜你喜欢

转载自blog.csdn.net/qq_40605429/article/details/80582735