uva 10129 Play on Words
2013-07-12 08:15
204 查看
uva 10129 Play on Words
欧拉回路,这题是有向图判断方法是 点出入度都相等或者 有2个点出入度相差1,其他点都相等
思路:有100000个字符串,看似很大,其实可以只存字母的出入度,因为字母只有'a' - 'z' 26个, 只要开26的数组即可,然后判断度数是否符合条件
#include <stdio.h> #include <string.h> int t; int n; char sb[1005]; int parent[26]; int ru[26]; int chu[26]; int vis[26]; int judge; int cent; int find(int x) { if (x != parent[x]) return find(parent[x]); else return x; } void uion(int a, int b) { a = find(a); b = find(b); if (a != b) parent[b] = a; } int main() { scanf("%d", &t); while (t --) { cent = 0; judge = 0; for (int i = 0; i < 26; i ++) parent[i] = i; memset(ru, 0, sizeof(ru)); memset(chu, 0, sizeof(chu)); memset(vis, 0, sizeof(vis)); scanf("%d", &n); getchar(); while (n --) { gets(sb); int a = sb[strlen(sb) - 1] - 'a'; int b = sb[0] - 'a'; ru[b] ++; chu[a] ++; vis[a] = vis[b] = 1; uion(a, b); } for (int i = 0; i < 26; i ++) { if (ru[i] != chu[i]) { if (ru[i] - chu[i] == 1 || ru[i] - chu[i] == -1) { cent ++; if (cent > 2) { judge = 1; break; } } else { judge = 1; break; } } } for (int i = 0; i < 26; i ++) { if (vis[i]) { for (int j = 0; j < 26; j ++) { if (vis[j]) { if (find(i) != find(j)) { judge = 1; break; } } } } if (judge) break; } if (judge) printf("The door cannot be opened.\n"); else printf("Ordering is possible.\n"); } return 0; }
相关文章推荐
- uva 10129 play on words——yhx
- 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——yhx
- 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
- 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
- Play on Words,UVA 10129——求欧拉回路/欧拉通路