rt,我搞不明白,这题的数据规模,只有54个字母,应该可以dfs吧,为什么TLE(TLE了6个点)呢?代码:
#define N 3000
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct Edge {int next, to;} edge[N];
int n, head[200], len_path, num_edge, other[N];
char path[N], tmp[N];
bool vst[N], sign[200];
void add_edge(int u, int v);
bool dfs(char u, int len, int num);
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
char u, v ;
cin >> u >> v;
sign[u] = sign[v] = true;
add_edge(u, v);
}
for (int i = 0; i < N; i++) path[i] = 123;
bool flag = false;
char i = 'A';
while (i != 'z')
{
if (sign[i])
{
flag = dfs(i, 1, 0);
if (flag) break;
}
if (i != 'Z') i++;
else i = 'a';
}
if (flag)
{
for (int i = 1; i <= len_path; i++) cout << path[i];
cout << endl;
}
else cout << "No Solution" << endl;
return 0;
}
void add_edge(int u, int v)
{
edge[++num_edge].next = head[u];
edge[num_edge].to = v;
head[u] = num_edge;
other[num_edge] = num_edge + 1;
edge[++num_edge].next = head[v];
edge[num_edge].to = u;
head[v] = num_edge;
other[num_edge] = num_edge - 1;
}
bool dfs(char u, int len, int num)
{
tmp[len] = u;
if (num == n)
{
bool upd = false;
for (int i = 1; i <= len; i++)
{
if (tmp[i] < path[i])
{
upd = true;
break;
}
else if (tmp[i] > path[i]) break;
}
if (upd)
{
for (int i = 1; i <= len; i++)
path[i] = tmp[i];
len_path = len;
}
return true;
}
bool res = false;
for (int i = head[u]; i; i = edge[i].next)
{
int v = edge[i].to;
if (!vst[i])
{
vst[i] = vst[other[i]] = true;
if (dfs(v, len + 1, num + 1)) res = true;
vst[i] = vst[other[i]] = false;
}
}
return res;
}