您的位置:首页 > 其它

UVA 10129 Play on Words

2014-07-21 18:55 218 查看
欧拉回路

以字母为结点,单词为边;注意两个相同的单词表示两条边。

并查集判断是否连通,出度,入度判断是否是欧拉回路

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

int map[100010];
int g[30][30];
int num[26][2];
int v[30],f[30];

int father (int i){
f[i]=f[i]==i?f[i]:father (f[i]);
return f[i];
}

int main (){
int t,n;
scanf ("%d",&t);
while (t--){
cin>>n;
char s[2000];
memset (v,0,sizeof v);
memset (g,0,sizeof g);
for (int i=0;i<n;i++){
scanf ("%s",s);
int len=strlen (s);
g[s[0]-'a'][s[len-1]-'a']++;
v[s[0]-'a']=v[s[len-1]-'a']=1;
}
int flag=1;
for (int i=0;i<30;i++)  f[i]=i;
for (int i=0;i<26;i++)
for (int j=0;j<26;j++)
if (g[i][j]||g[j][i])
f[father(i)]=father(j);
for (int i=0;i<26;i++){
for (int j=0;j<26;j++){//cout<<i<<j<<endl;
if (v[i]&&v[j]){
if (father(i)!=father(j)){
flag=0;break ;
}
}
}
if (!flag)
break ;
}
if (!flag){
printf ("The door cannot be opened.\n");
continue ;
}
int c,r;//cout<<"error"<<endl;
c=1;r=1;
for (int i=0;i<26;i++){
int temp=0;
for (int j=0;j<26;j++){
temp+=g[i][j]-g[j][i];
}
if (temp==1&&c)
c=0;
else if (temp==-1&&r)
r=0;
else if (temp==0) ;
else {
flag=0;
break ;
}
}
if (flag)
printf ("Ordering is possible.\n");
else printf ("The door cannot be opened.\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: