HDU 1878欧拉回路

来源:互联网 发布:win10删除多余的网络2 编辑:程序博客网 时间:2024/05/22 15:56
欧拉回路
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
Submit Status Practice HDU 1878

Description

欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?

Input

测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结 
束。

Output

每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。 

Sample Input

3 31 21 32 33 21 22 30

Sample Output

1

0

#include<stdio.h>#include<string.h>using namespace std;int pre[1010];int lu[1010];int find(int p){int x=p;int t;while(p!=pre[p])p=pre[p];return p;}void Merge(int x,int y){int fx=find(x);int fy=find(y);if(fx!=fy)pre[fy]=fx;}int main(){    int n,m,i,j,x,y,ans,sum;    while(scanf("%d",&n)&&(n!=0))    {        for(i=1;i<=n;i++)        pre[i]=i;        scanf("%d",&m);        memset(lu,0,sizeof(lu));        while(m--)        {            scanf("%d%d",&x,&y);            Merge(x,y);            lu[x]++;            lu[y]++;         }        ans=0;sum=0;        for(i=1;i<=n;i++)        {            if(pre[i]==i)            {                ans++;                if(ans>1)                break;            }            if(lu[i]&1)            sum++;        }        if(ans>1)        {            printf("0\n");            continue;         }        if(sum==0)        printf("1\n");        else        printf("0\n");    }    return 0;}


0 0
原创粉丝点击