POJ1386 xingxing在努力
本题的题意就是给你一些单词让你判断能否将这些单词收尾相接串到一起,典型地欧拉回路,这题用欧拉路判断是应该注意单词可以是一条链也可以是一个环。
在此附上有向图欧拉路存在的条件
1:图连通
2:有一个顶点出度比入度大一,还有一个顶点入度比出度大一 其余入度=出度
有向图欧拉回路存在的条件
1:图连通
2:所有顶点入度 = 出度
无向图欧拉路存在的条件
1:图连通
2:有且只有两个顶点度为奇数
无向图欧拉回路存在的条件
1:图连通
2:所有顶点的度为偶数
附上代码:
#include <cstdio> #include <algorithm> #include <cstring> using namespace std; int dgin[30], dgout[30]; int n; char str[1010]; int par[30]; void init() { for(int i=0; i<26; i++) par[i] = i; } int Find(int x) { if(x == par[x]) return x; else return par[x] = Find(par[x]); } void Union(int a, int b) { a = Find(a), b = Find(b); if(a != b) { par[a] = b; } } int main() { int T; scanf("%d", &T); while(T--) { init(); memset(dgin, 0, sizeof(dgin)); memset(dgout, 0, sizeof(dgout)); scanf("%d", &n); while(n--) { scanf("%s", str); int len = strlen(str); int u = str[0]-'a', v = str[len-1]-'a'; dgout[u]++; dgin[v]++; // if(u != v) Union(u, v); } // int parent = Find(0); //注意这里a可能从来没出现过所以粗无:wa了一次 int parent = 0; for(int i=0; i<26; i++) if(dgin[i]||dgout[i]) { parent = Find(i); break; } int flog = 1; for(int i=1; i<26&&flog; i++) { if((dgin[i]||dgout[i]) && Find(i)!=parent) flog = 0; } if(!flog) { printf("The door cannot be opened.\n"); continue; } bool fg = true, num1 = 0, num2 = 0; for(int i=0; i<26&&fg; i++) { if(dgin[i]-dgout[i] == 1) num1++; else if(dgin[i]-dgout[i] == -1) num2++; else if(dgin[i]-dgout[i] != 0) fg = false; } if(fg == false) printf("The door cannot be opened.\n"); else { if((num1==0&&num2==0) || (num1==1 && num2==1)) printf("Ordering is possible.\n"); else printf("The door cannot be opened.\n"); } } return 0; }

浙公网安备 33010602011771号