前提,连通
无向欧拉回路:所有结点的度数为偶数
无向欧拉通路:度数为奇数的结点有奇数个
有向欧拉回路:所有结点的出度等于入度
有向欧拉通路:有一个结点的出度=入度+1,还有一个结点的出度=入度-1,其他结点的出度=入度
做这道题的时候,求出两点的坐标存入A数组时,我在比较两个结点的出度和入度的时候,一直在用标号比较(A[i]中的i),应该用A[i];估计又二了!
#include"stdio.h"
#include"string.h"
#define N 28
int set[N];
int find(int x)
{
if(set[x]==x)return x;
set[x]=find(set[x]);
return set[x];
}
void merge(int a,int b)
{
int x,y;
x=find(a);
y=find(b);
if(x!=y)set[y]=x;
}
int main()
{
int T;
int i;
int n,m;
int a,b;
int A[N];
char s[1001];
int in[N],out[N];
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
getchar();
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
memset(A,0,sizeof(A));
for(i=0;i<26;i++)set[i]=i;
for(i=0;i<n;i++)
{
gets(s);
a=s[0]-'a';
b=s[strlen(s)-1]-'a';
in[a]++;
out[b]++;
A[a]=A[b]=1;
merge(a,b);
}
int cnt=0;
for(i=0;i<26;i++)if(set[i]==i&&A[i])cnt++;
if(cnt>1)printf("The door cannot be opened.\n");
else
{
cnt=0;a=0;b=1;
for(i=0;i<26;i++)
if(in[i]!=out[i])A[cnt++]=i;
if(cnt==0)printf("Ordering is possible.\n");
else if((cnt==2)&&
((in[A[a]]+1==out[A[a]]&&in[A[b]]-1==out[A[b]])
||(in[A[a]]-1==out[A[a]]&&in[A[b]]+1==out[A[b]])))
printf("Ordering is possible.\n");
else printf("The door cannot be opened.\n");
}
}
return 0;
}