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;
}
posted @ 2012-10-29 18:04  Titanium  阅读(541)  评论(0编辑  收藏  举报