題目
輸入n(n≤100000)個單詞,是否可以把所有這些單詞排成乙個序列,使得每個單詞的第乙個字母和上乙個單詞的最後乙個字母相同(例如 acm,malform,mouse)。每個單詞最多包含1000個小寫字母。輸入中可以有重複單詞。
解題思路
把字母看作結點,單詞看作有向邊,則問題有解等價於圖中存在尤拉道路。有向圖中存在尤拉道路的條件有兩個:一是底圖(忽略邊的方向後得到的無向圖)連通,二是度數滿足不存在奇點或奇點數為2。度數判讀只要在輸入時記錄每個頂點的入度出度,而連通性判斷有兩種:dfs和並查集。
**實現
dfs判斷連通性+特判入出度
1 #include2 #include3using
namespace
std;45
const
int maxn = 26 + 5;6
int g[maxn][maxn],in[maxn],out
[maxn];
7int vis[maxn]; //
點是否訪問,不是邊
8intn;9
char word[1000 + 10
];10
11void dfs(int
u)1220}
2122
intmain()
2346
47bool flag = true; //
滿足要求為true
48int s_odd = 0,t_odd = 0; //
起始奇點、結束奇點
49for (int i = 0; i < maxn; i++)
5053
else
if (in[i] == out[i] + 1 && !t_odd) t_odd = 1;54
else 55}
56if
(flag)
5761}62
63if (flag) printf("
ordering is possible.\n");
64else printf("
the door cannot be opened.\n");
65}66return0;
67 }
並查集判斷連通性+特判入出度
1 #include2 #include3 #include4 #include5 #include6 #include7
using
namespace
std;89
const
int maxn = 26 + 5;10
intin[maxn], out
[maxn], flag[maxn], p[maxn], fa[maxn];
11int
n;12
13void
init()
1422
int find(int
x)23
2728
void unite(int x, int
y)29
3435
intmain()
3655
56int cnt = 0; //
記錄連通分量
57int
root;
58for (int i = 0; i < 26; i++)
5965}66
for (int i = 0; i < 26; i++)
6771
72if
(cnt)
7677
int k = 0; //
p[i]記錄度數不等的
78for (int i = 0; i < 26; i++)
7982
if (k == 0)83
87if (k == 2 && (in[p[0]] - out[p[0]] == 1 && in[p[1]] - out[p[1]] == -1) || (in[p[0]] - out[p[0]] == -1 && in[p[1]] - out[p[1]] == 1
))88
92else
9396}97
return0;
98 }
UVa 10129 單詞 (尤拉通路)
輸入n n 100000 個單詞,是否可以把所有這些單詞排成乙個序列,使得每個單詞的第乙個字母和上乙個單詞的最後乙個字母相同 例如acm malform mouse 每個單詞最 多包含1000個小寫字母。輸入中可以有重複單詞。可以看出,把字母看成頂點 最多26個 然後單詞就是有向邊,單詞與單詞之間的...
Uva10129 尤拉迴路
play on wordsuva 10129 ordering is possible.the door cannot be opened.1 include2 include3 include4 const int maxn 26 5 using namespace std 6 7尤拉迴路 8圖是...
UVA10129 尤拉迴路 DFS
第一次寫部落格,以前一直沒有總結過,現在開始對自己學的東西做一些記錄吧,方便以後複習或者就當作留個腳印。筆者目前大一,水平弱弱弱 有不正確的地方或者可以改進的地方還望指出。找夥伴,有想一起學習的朋友可以一起交流交流。email zpengst outlook.com 題目大意 輸入n個單詞,判斷是否...