#include
#include
#define maxn 26
int tree[maxn];
int degree[maxn];
int vis[maxn];
int findRoot(int u){
if(tree[u] == -1) return u;
int v = findRoot(tree[u]);
tree[u] = v;
return v;
}
int main(){
int t, n;
char word[1001];
scanf("%d", &t);
while(t--){
scanf("%d", &n);
memset(tree, -1, sizeof(tree));
memset(degree, 0, sizeof(degree));
memset(vis, 0, sizeof(vis));
while(n--){
scanf("%s", word);
int start = word[0] - 'a', end = word[strlen(word) - 1] - 'a';
--degree[start]; ++degree[end];
vis[start] = 1; vis[end] = 1;
int p = findRoot(start), q = findRoot(end);
if(p != q) tree[p] = q;
}
int i, oth = 0, pos = 0, neg = 0, c = 0;
for(i = 0; i < maxn; ++i){
if(tree[i] == -1 && vis[i]) ++c;
if(degree[i] == 1) ++pos;
else if(degree[i] == -1) ++neg;
else if(degree[i] != 0) ++oth;
}
if(c==1 && oth==0 && (neg==0&&pos==0 || neg==1&&pos==1))
printf("Ordering is possible.\n");
else
printf("The door cannot be opened.\n");
}
return 0;
}
hud1116
和poj2337類似,不需要輸出路徑,需要注意的是要記錄單詞首尾字母所對應的頂點,並非在一個case中26個字母都對應是頂點。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.