参考这里的点击打开链接,把欧拉路径和欧拉回路的判断总结的淋漓尽致。
/******************************************************************************* # Author : Neo Fung # Email : [email protected] # Last modified: 2011-10-08 19:53 # Filename: ZOJ2016 POJ1386 HDU1116 Play on Words.cpp # Description : *欧拉回路,所有点连通,并且所有点的入度等于出度。 *欧拉通路。从原点S出发,经过所有点,从终点t出去。 *本题用并查集方法确定所有的点是否连通 *所有点除起点终点外的度都是偶数,且出度等于入度 *起点的出度比入度大1 *终点的入度比出度大1 ******************************************************************************/ // #include "stdafx.h" // #define DEBUG #include <fstream> #include <stdio.h> #include <iostream> #include <string.h> #include <string> #include <memory.h> #include <limits.h> #define MAX 30 using namespace std; int outD[MAX],inD[MAX],pre[MAX]; int find(int x) { if(pre[x]==-1) pre[x]=x; return x==pre[x]?x:find(pre[x]); } void myUnion(const int &x,const int &y) { int a=find(x); int b=find(y); pre[a]=pre[b]=pre[x]=pre[y]=min(a,b); } int check() { int ind=0; while(pre[ind]==-1) ++ind; int tmp=pre[ind]; for(int i=ind+1;i<26;++i) if(pre[i]!=-1 && find(i)!=tmp) return 0; return 1; } int main(void) { #ifdef DEBUG freopen("data.txt","r",stdin); #endif int ncases,n; char str[1010]; scanf("%d",&ncases); while(ncases--) { memset(outD,0,sizeof(outD)); memset(inD,0,sizeof(inD)); for(int i=0;i<MAX;++i) pre[i]=-1; scanf("%d",&n); getchar(); while(n--) { scanf("%s",str); int len=strlen(str); myUnion(str[0]-'a',str[len-1]-'a');//并查集 // ++inD[str[0]-'a']; // ++outD[str[len-1]-'a']; ++outD[str[0]-'a']; ++inD[str[len-1]-'a']; } int ans=check(); if(!ans) { printf("The door cannot be opened.\n"); continue; } int sum=0; int temp[MAX]; memset(temp,0,sizeof(temp)); for(int i=0;i<26;++i) if(outD[i]!=inD[i]) temp[sum++]=i; if (sum==0) { printf("Ordering is possible.\n"); //所有点的出度等于入度,欧拉回路 continue; } if(sum!=2) { printf("The door cannot be opened.\n"); //除了起点和终点的出入度不等以外,别的点的出入度都必须相等,否则就不是欧拉路径 continue; } if((outD[temp[0]]-inD[temp[0]]==1 && inD[temp[1]]-outD[temp[1]]==1) || (outD[temp[1]]-inD[temp[1]]==1 && inD[temp[0]]-outD[temp[0]]==1) )//判断出入度是否符合要求 printf("Ordering is possible.\n"); else printf("The door cannot be opened.\n"); } return 0; }