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