POJ 1386 Play on Words(有向歐拉通路 連通圖)
阿新 • • 發佈:2017-05-24
tput mouse char s tdi 任務 input using 否則 表示
題目描寫敘述:
有些秘門帶有一個有趣的詞迷。考古學家必須解開詞迷才幹打開門。因為沒有其它方法能夠 打開門,因此詞迷就變得非常重要。 每一個門上有很多磁盤。每一個盤上有一個單詞,這些磁盤必須又一次排列使得每一個單詞第一個字 母跟前一個單詞後一個字母同樣。比如單詞"acm"能夠跟在單詞"motorola"的後面。
題意 見下方中文翻譯
每一個單詞能夠看成首尾兩個字母相連的一條邊 然後就是輸入m條邊 推斷是否能構成有向歐拉通路了
有向圖存在歐拉通路的充要條件:
1. 有向圖的基圖連通;
2. 全部點的出度和入度相等 或者 僅僅有兩個入度和出度不相等的點 且這兩點入度與出度的差一個為-1(起點)一個為1(終點).
推斷是否連通就是應用並查集了
#include<cstdio> #include<cstring> using namespace std; const int N = 30, M = 100010; struct edge{int u, v; } e[M]; int vis[N], in[N], out[N], par[N], m, ok; int Find(int x) { int r = x, tmp; while(par[r] >= 0) r = par[r]; while(x != r) { tmp = par[x]; par[x] = r; x = tmp; } return r; } void Union(int u, int v) { int ru = Find(u), rv = Find(v), tmp = par[ru] + par[rv]; if(par[ru] < par[rv]) par[rv] = ru, par[ru] = tmp; else par[ru] = rv, par[rv] = tmp; } void connect() { memset(par, -1, sizeof(par)); //初始化並查集 for(int i = 0; i < m; ++i) { int u = e[i].u, v = e[i].v; if(Find(u) != Find(v)) Union(u, v); } for(int i = 0; i < 26; ++i) for(int j = 0; j < 26; ++j) if(vis[i] && vis[j] && Find(i) != Find(j)) ok = 0; } int main() { char s[1005]; int u, v, cas; scanf("%d", &cas); while(cas--) { for(int i = 0; i < 26; ++i) vis[i] = in[i] = out[i] = 0; scanf("%d", &m); for(int i = 0; i < m; ++i) { scanf("%s", s); u = s[0] - ‘a‘, v = s[strlen(s) - 1] - ‘a‘; vis[u] = vis[v] = 1; e[i].u = u, e[i].v = v; ++in[u], ++out[v]; } int id = 0, od = 0;//i[d]記錄入度比出度大1的點的個數 o[d]小1 ok = 1; for(int i = 0; i < 26; ++i) { if(!vis[i]) continue; int k = in[i] - out[i]; if(k < -1 || k > 1) {ok = 0; break;} if(k == 1) ++id; if(k == -1) ++od; } if(id > 1 || od > 1 || id - od) ok = 0; connect(); if(ok) printf("Ordering is possible.\n"); else printf("The door cannot be opened.\n"); } return 0; }
有些秘門帶有一個有趣的詞迷。考古學家必須解開詞迷才幹打開門。因為沒有其它方法能夠 打開門,因此詞迷就變得非常重要。 每一個門上有很多磁盤。每一個盤上有一個單詞,這些磁盤必須又一次排列使得每一個單詞第一個字 母跟前一個單詞後一個字母同樣。比如單詞"acm"能夠跟在單詞"motorola"的後面。
你的任務是 編寫一個程序,讀入一組單詞。然後判定能否夠經過重組使得每一個單詞第一個字母跟前一個單 詞後一個字母同樣。這樣才幹打開門。
輸入描寫敘述:
輸入文件裏包括 T 個測試數據。輸入文件的第一行就是 T,接下來是 T 個測試數據。
每一個測 試數據的第一行是一個整數 N,表示單詞的個數(1≤N≤100000);接下來有 N行。每行是一個 單詞。每一個單詞至少有 2個、至多有 1000 個小寫字母,即單詞中僅僅可能出現字母‘a‘~‘z‘;在同一 個測試數據中,一個單詞可能出現多次。
輸出描寫敘述:
假設通過重組單詞能夠達到要求,輸出"Ordering is possible.",否則輸出"The door cannot be opened."。
Sample Input
3
2
acm
ibm
3
acm
malform
mouse
2
ok
ok
Sample Output
The door cannot be opened.
Ordering is possible.
The door cannot be opened.
POJ 1386 Play on Words(有向歐拉通路 連通圖)