#44,51∼58,62 过了,其它全 WA,太离奇了,求大佬帮助……
#include <bits/stdc++.h>
using namespace std;
#define EOL '\n'
#define __LOG true
#ifdef __LOG
#define PRINTF printf
#else
#define PRINTF //
#endif
#define __IOFILE true
#ifdef __IOFILE
#define FREOPEN freopen
#else
#define FREOPEN //
#endif
const int iINF = 0x3f3f3f3f;
const long long lINF = 9e18;
struct Graph
{
int to[2010], wei[2010], nxt[2010], pos[20], tot;
Graph(): tot(0) {}
void AddEdge(int u, int v, int w)
{
++tot;
to[tot] = v;
wei[tot] = w;
nxt[tot] = pos[u];
pos[u] = tot;
}
};
int length[20][20], dep[20];
Graph G;
long long f[5010];
bool vis[20];
void get_dep(int u)
{
vis[u] = true;
for (int eid = G.pos[u]; eid; eid = G.nxt[eid])
{
int v = G.to[eid];
if (vis[v])
{
continue;
}
dep[v] = dep[u] + 1;
get_dep(v);
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n, m;
cin >> n >> m;
memset(length, 0x3f, sizeof length);
while (m--)
{
int u, v, w;
cin >> u >> v >> w;
if (u == v)
{
continue;
}
length[u][v] = length[v][u] = min(length[u][v], w);
}
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= n; ++j)
{
if (length[i][j] != iINF)
{
G.AddEdge(i, j, length[i][j]);
}
}
}
int k = (1 << n) - 1;
long long ans = lINF;
for (int start_u = 1; start_u <= n; ++start_u)
{
memset(f, 0x3f, sizeof f);
f[(1 << (n - start_u))] = 0;
for (int status = 1; status < k; ++status)
{
for (int i = 1; i <= n; ++i)
{
vis[i] = !(status & (1 << (n - i)));
}
dep[start_u] = 1;
get_dep(start_u);
for (int u = 1; u <= n; ++u)
{
if (!(status & (1 << (n - u))))
{
continue;
}
for (int eid = G.pos[u]; eid; eid = G.nxt[eid])
{
int v = G.to[eid], w = G.wei[eid];
if (status & (1 << (n - v)))
{
continue;
}
f[status + (1 << (n - v))] = min(f[status + (1 << (n - v))], f[status] + (dep[u]) * w);
}
}
}
ans = min(ans, f[k]);
}
cout << ans << EOL;
return 0;
}