uva 10596 Morning Walk

 其实题意不是很明白,看了别人的解题报告然后按照思路来实现,最后AC了,但是对于题意还是很有问题

判断是否有欧拉回路,图要连通(用并查集来处理),然后所有顶点的度数为偶数

在这个博客中 http://www.cnblogs.com/penseur/archive/2011/02/28/1967412.html  说输入的边中要包含所有的点才是存在,但是按照这个AC代码以及网上找回来的大部分代码表明是不需要包括所有代码的

例如

10 2

8 9

9 8

输出Possible

按照这个AC代码的意思应该是前面的点可以不存在,但是一旦出现了第i个点,那么必须从第i个点到第n-1个点都存在,而且图连通,度为偶数,才存在欧拉回路

例如

10 4

2 3

3 2

8 9

9 8

输出 Not Possible

 

 

#include <stdio.h>

#include <string.h>

#define N 210

#define M 10010

int d[N],p[N];

int n,m;



int find(int x)

{  return p[x]==x ? x : find(p[x]);  }



int main()

{

    int i,j,u,v,x,y,tmp,flag;

    while(scanf("%d%d",&n,&m)!=EOF)

    {

        if(!m) { printf("Not Possible\n"); continue; }

        memset(d,0,sizeof(d));

        for(i=0; i<n; i++) p[i]=i;



        for(i=1; i<=m; i++)

        {

            scanf("%d%d",&u,&v);

            d[u]++; d[v]++;

            x=find(u);

            y=find(v);

            if(x!=y)

                p[u]=v;

        }



        for(i=0; d[i]==0; i++) ;

        tmp=find(i); flag=1;

        for(j=i+1; j<n; j++)

            if(tmp!=find(j) || (d[j]%2) )

            { flag=0; break;}



        if(flag) printf("Possible\n");

        else     printf("Not Possible\n");

/*

        printf("d: ");

        for(i=0; i<n; i++) printf("%d ",d[i]);

        printf("\n");

        printf("find: ");

        for(i=0; i<n; i++) printf("%d ",find(i));

        printf("\n");

*/

    }

    return 0;

}

你可能感兴趣的:(uva)