#include <bits/stdc++.h>
using namespace std;
#define INF 1917483645
long long c[20][20];
long long tar[50][50];
long long lev[50];
long long vis[50];
long long n, m, ans = INT_MAX, tmp, tot, cnt;
void dfs(long long num, long long node) {
for(long long i = num; i <= cnt; ++i) {
if(tot + tmp * lev[vis[i]] >= ans) {
return;
}
for(long long j = node; j <= tar[vis[i]][0]; ++j) {
if(!lev[tar[vis[i]][j]]) {
cnt++;
vis[cnt] = tar[vis[i]][j];
tmp -= c[vis[cnt]][tar[vis[cnt]][1]];
tot += c[vis[i]][vis[cnt]] * lev[vis[i]];
lev[vis[cnt]] = lev[vis[i]] + 1;
dfs(i, j + 1);
tot -= c[vis[i]][vis[cnt]] * lev[vis[i]];
lev[vis[cnt]] = 0;
tmp += c[vis[cnt]][tar[vis[cnt]][1]];
cnt--;
}
}
node = 1;
}
if(cnt == n) {
ans = min(tot, ans);
return;
}
}
signed main() {
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= n; j ++)
c[i][j] = INF;
for(long long i = 1; i <= m; ++i) {
long long a, b, v;
scanf("%d %d %d", &a, &b, &v);
if(v > c[a][b]) {
continue;
}
if(c[a][b] == INF) {
tar[a][++tar[a][0]] = b;
tar[b][++tar[b][0]] = a;
}
c[a][b] = c[b][a] = v;
}
for(long long i = 1; i <= n; ++i) {
sort(tar[i] + 1, tar[i] + 1 + tar[i][0], [=](long long a, long long b) {
return c[i][a] < c[i][b];
});
tmp += c[i][tar[i][1]];
}
for(long long i = 1; i <= n; ++i) {
tot = 0;
cnt = 1;
vis[1] = i;
tmp -= c[i][tar[i][1]];
lev[i] = 1;
dfs(1, 1);
lev[i] = 0;
tmp += c[i][tar[i][1]];
}
printf("%d", ans);
return 0;
}
这份代码是跟着第一篇题解写的,发生了很玄学的事情,不开O2只有5分,其他都是RE.数据点拿到本地测也没问题。但是洛谷一开O2就AC了,求大佬找找原因