代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <queue>
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define fo1(a,b) for(int a=0;a<b;++a)
#define fo2(a,b) for(int a=1;a<=b;++a)
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=1e5+5;
const int mod=1e9+7;
const double eps=1e-4;
int t,n,m,u,v,w,total,path[20][20],f[1<<16][16];
void init(){
mem(path,0);
fo1(i,n){
fo1(j,n){
if(i!=j)
path[i][j]=inf;
}
}
}
void floyed(){
fo1(k,n) fo1(i,n) fo1(j,n)
path[i][j]=min(path[i][j],path[i][k]+path[k][j]);
}
void comb_dp(){
for(int k=1;k<total;++k){
fo1(i,n){
if(f[k][i]==inf)
continue;
fo1(j,n)
f[k|1<<j][j]=min(f[k|1<<j][j],f[k][i]+path[i][j]);
}
}
}
void put(){
int ans=inf;
fo1(i,n)
ans=min(ans,f[total-1][i]+path[0][i]);
printf("%d\n",ans);
}
int main()
{
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
init();
fo2(i,m){
scanf("%d%d%d",&u,&v,&w);
u--,v--;
if(path[u][v]>w)
path[u][v]=path[v][u]=w;
}
floyed();
total=1<<n;
mem(f,inf);
f[1][0]=0;
comb_dp();
put();
}
return 0;
}