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; }
相关文章推荐
- Uva - 10129 - Play on Words
- uva 10129 Play on Words
- uva 10129 play on words——yhx
- Play on Words UVA - 10129 欧拉路径
- UVa 10129 Play on Words ( euler path )
- uva 10129 Play on Words
- Uva - 10129 - Play on Words
- UVA 10129 Play on Words
- uva 10129 Play on Words
- UVA 10129 Play on Words (欧拉通路)
- UVA - 10129 Play on Words (欧拉路径+dfs)
- UVa 10129 - Play on Words (欧拉回路, DFS)
- uva 10129 play on words——yhx
- UVA 10129 Play on Words
- UVA10129 Play on Words【思路】
- UVA 10129 - Play on Words
- HDU 1116 && UVA 10129 && POJ 1386 ------ Play on Words(欧拉路径 + 并查集)
- UVA 10129 Play on Words 欧拉回路
- uva 10129 - Play on Words
- UVA-10129 Play on Words