#include<cstdio>#include<algorithm>#include<cctype>#include<cstring>#define maxn 15#define INF 0x3f3f3f3f3f3f3f3fusingnamespace std;bool vis[maxn];int n, m, p[maxn], dep[maxn];longlong ans = INF, dis[maxn][maxn];/*
void dfs(int cur, int ti, int cost){
if (cost >= res || cost >= ans) return;
if (ti == n){
res = min(res, cost);
return;
}
vis[cur] = true; p[ti] = cur;
for (int k = 1; k <= ti; k++){
for (int i = 1; i <= n; i++){
if (!vis[i] && dis[p[k]][i] != INF){
dep[i] = dep[p[k]] + 1;
dfs(i, ti + 1, cost + dis[p[k]][i] * dep[i]);
}
}
}
vis[cur] = false; p[ti] = 0;
}
*/inlinevoidread(int&x){
x =0;char ch =getchar();while(!isdigit(ch)) ch =getchar();while(isdigit(ch)) x =(x *10)+(ch &15), ch =getchar();}inlinevoiddfs(int ti,longlong cost){if(cost >= ans)return;if(ti == n){
ans =min(ans, cost);return;}for(int next =1; next <= n; next++){if(!vis[next]){
vis[next]=true, p[ti +1]= next;/*
for (int k = 1; k <= ti; k++)
if (dis[next][p[k]] != INF){
dep[next] = dep[p[k]] + 1;
dfs(ti + 1, cost + dis[next][p[k]] * dep[next]);
}
*/longlong Min = INF;int u =0;for(int k =1; k <= ti; k++)if(dis[next][p[k]]!= INF){if((dep[p[k]]+1)* dis[next][p[k]]< Min){
Min =(longlong)(dep[p[k]]+1)* dis[next][p[k]];
u = p[k];}}
dep[next]= dep[u]+1;dfs(ti +1, cost + Min);
vis[next]=false;}}}intmain(){// freopen("testdata(2).in", "r", stdin);memset(dis,0x3f,sizeof dis);read(n),read(m);for(int u, v, l, i =1; i <= m; i++){read(u),read(v),read(l);
dis[u][v]=min(dis[u][v],1ll* l);
dis[v][u]=min(dis[v][u],1ll* l);}for(int i =1; i <= n; i++){
dep[i]=0;
vis[i]=true, p[1]= i;dfs(1,0);
vis[i]=false;}printf("%lld\n", ans);return0;}
random_shuffel
#include<cstdio>#include<cctype>#include<cstring>#include<algorithm>#define maxn 15#define INF 0x3f3f3f3f3f3f3f3fusingnamespace std;inlinevoidread(int&x){
x =0;int opt =1;char ch =getchar();while(!isdigit(ch)){if(ch =='-') opt =-1; ch =getchar();}while(isdigit(ch)) x =(x *10)+(ch &15), ch =getchar();
x *= opt;}longlong dis[maxn][maxn];int n, m, p[maxn], dep[maxn];intmain(){memset(dis,0x3f,sizeof dis);read(n),read(m);for(int u, v, l, i =1; i <= m; i++){read(u),read(v),read(l);
dis[u][v]=min(dis[u][v],1ll* l);
dis[v][u]=min(dis[v][u],1ll* l);}for(int i =1; i <= n; i++) p[i]= i;int Time =50000;longlong ans = INF;while(Time--){longlong res =0;random_shuffle(p +1, p + n +1);memset(dep,0,sizeof dep);int u =0;bool f =true;for(int i =2; i <= n; i++){
f =false;longlong Min = INF;for(int j = i -1; j >=1; j--)if(dis[p[i]][p[j]]!= INF){
f =true;if(dis[p[i]][p[j]]*(dep[p[j]]+1)< Min){
Min = dis[p[i]][p[j]]*(dep[p[j]]+1);
u = p[j];}}if(!f)break;
dep[p[i]]= dep[u]+1;
res += Min;}if(f) ans =min(ans, res);}printf("%lld\n", ans);return0;}