问一下关于复杂度的正确性
  • 板块P1127 词链
  • 楼主elsc
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/20 22:27
  • 上次更新2024/10/21 11:28:28
查看原帖
问一下关于复杂度的正确性
750618
elsc楼主2024/10/20 22:27

半年后再来看此题对当初代码的复杂度有一点疑惑:

#include <bits/stdc++.h>
using namespace std;

int n;
string a[1005];
vector<int> G[1005]; 

int in[128], out[128];

vector<int> F;
bool vis[1005];
void dfs(int u, int tot) {
	if (vis[u]) return;
	vis[u] = true;
	F.push_back(u);
	if (tot == n) {
		cout << a[F[0]];
		for (int i = 1; i < (int)F.size(); ++i) cout << '.' << a[F[i]];
		exit(0);
	}
	for (auto v : G[u]) dfs(v, tot + 1);
	F.pop_back();
	vis[u] = false;
}

int main() {
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	cin >> n;
	for (int i = 1; i <= n; ++i) cin >> a[i], ++in[(int)a[i].front()], ++out[(int)a[i].back()];
	sort(a + 1, a + n + 1);
	for (int i = 1; i <= n; ++i) for (int j = i + 1; j <= n; ++j) {if (a[j].front() == a[i].back()) G[i].push_back(j);if (a[i].front() == a[j].back()) G[j].push_back(i);}
	for (int i = 1; i <= n; ++i) if (in[(int)a[i].front()] == out[(int)a[i].front()] + 1) dfs(i, 1);
	dfs(1, 1);
	cout << "***";
	return 0;
}

感觉上这份代码会检查图中所有可能的路径从而达到指数级复杂度,但只是简单利用欧拉路径的性质 “剪枝” 后就跑得飞快(40 ms),想问一下它的复杂度究竟如何,能否给个证明或构造 hack 的方法。

2024/10/20 22:27
加载中...