题意:给你n个单词(只有小写),要求这些单词首尾相连,问你这n个单词能不能全部连起来,可以连成一条链或者连成一个环,如果可以输出路径,不可以输出“***”。
思路:先判断度数,然后判断图的连通,在回溯的时候记录路径。
虽然AC了但是还是有一个地方不是很明白,看来对递归和回溯的过程理解还是不够啊。
不明白的地方:cnt是全局变量,对于dfs过程,如果过程中选择了错误的路怎么办?为什么却能求出正确答案?哪位大神帮忙解答下,万分感谢!!!比如下面的第三组样例,可以以此为例进行讲解!
AC代码:
//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <vector>
using namespace std;
const int MAXN = 30;
const int MAXM = 1005;
struct Edge
{
int from, to; //起点,终点
Edge(int from, int to) : from(from), to(to) {}
};
struct EulerianPath
{
int n, m, s, t;
vector<Edge> edges;
vector<int> G[MAXN];
int indeg[MAXN], outdeg[MAXN];
bool vis[MAXM];
vector<int> ans;
void init(int n)
{
this->n = n, m = 0;
edges.clear(), ans.clear();
for (int i = 0; i <= n; i++) G[i].clear();
for (int i = 0; i <= n; i++) indeg[i] = outdeg[i] = 0;
memset(vis, 0, sizeof(vis));
}
void AddEdge(int from, int to)
{
outdeg[from]++, indeg[to]++;
edges.push_back(Edge(from, to));
m = edges.size();
G[from].push_back(m - 1);
}
void Fleury(int u)
{
for (int i = 0; i < G[u].size(); i++)
{
Edge& e = edges[G[u][i]];
if (!vis[G[u][i]])
{
vis[G[u][i]] = true;
Fleury(e.to);
ans.push_back(G[u][i]);
}
}
}
bool eulerianpath()
{//注意点编号从0开始
s = t = -1;
int cnt = 0;
for (int i = 0; i < n; i++)
{
if (abs(outdeg[i] - indeg[i]) >= 2) return false;
if (outdeg[i] == indeg[i] + 1) s = i, cnt++;
if (outdeg[i] == indeg[i] - 1) t = i, cnt++;
if (s == -1 && outdeg[i] == indeg[i] && outdeg[i]) s = t = i;
}
if (cnt > 2 || s == -1 || t == -1) return false;
Fleury(s);
if (ans.size() == m) return true;
return false;
}
}gao;
int n;
string str[MAXM];
int main()
{
int T; scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
gao.init(26);
for (int i = 0; i < n; i++) cin >> str[i];
sort(str, str + n);
for (int i = 0; i < n; i++)
{
int u = str[i][0] - 'a', v = str[i][str[i].size()-1]-'a';
gao.AddEdge(u, v);
}
if (!gao.eulerianpath()) printf("***\n");
else
{
for (int i = gao.ans.size() - 1; i >= 0; i--)
{
cout << str[gao.ans[i]];
if (i != 0) cout << ".";
else cout << endl;
}
}
}
}
/*
5
6
aloha
arachnid
dog
gopher
rat
tiger
3
oak
maple
elm
5
aa
ab
aba
ba
bb
3
ab
ac
bc
4
w
ww
www
wwww
*/