题目链接:Click here~~
题意:
给 n 个词语,问是否能够词语接龙。
解题思路:
先用并查集找连通分量,然后根据结论来吧。
#include <map> #include <vector> #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; namespace UFset { const int N = 27; int pre[N]; void init(){ memset(pre,-1,sizeof(pre)); } int root(int x){ return pre[x] == -1 ? x : pre[x] = root(pre[x]); } bool gather(int a,int b){ int r1 = root(a); int r2 = root(b); if(r1 == r2) return false; else pre[r1] = r2; return true; } } using namespace UFset; int ind[N],outd[N]; bool EulerTour(int n) //direct { int rt = -1; for(int i=1;i<=n;i++) if(ind[i] || outd[i]) { if(rt == -1) rt = root(i); else if(rt != root(i)) return false; } vector<int> tmp; for(int i=1;i<=n;i++) if(ind[i] != outd[i]) tmp.push_back(outd[i]-ind[i]); return (int)tmp.size() == 0 || (int)tmp.size() == 2 && tmp[0] * tmp[1] == -1; } char word[1005]; int main() { int n = 26,m,T; scanf("%d",&T); while(T--) { init(); scanf("%d",&m); memset(ind,0,sizeof(ind)); memset(outd,0,sizeof(outd)); for(int i=0;i<m;i++) { scanf("%s",word); int u = word[0] - 'a' + 1; int v = word[strlen(word)-1] - 'a' + 1; gather(u,v); ++outd[u] , ++ind[v]; } puts(EulerTour(n)?"Ordering is possible.":"The door cannot be opened."); } return 0; }