package algorithm;
import java.util.Scanner;
public class test {
public static int T,n,m,w,u,v,G[][],dp[][],INF=(1<<30)-1;
public static void floyd() {
for(int k=1;k<=n;++k) {
G[k][k]=0;
for(int i=1;i<=n;++i) {
for(int j=1;j<=n;++j) {
G[i][j]=Math.min(G[i][k]+G[k][j], G[i][j]);
}
}
}
}
public static int solve() {
for(int i=1;i<=n;i++) {
dp[i][(1<<(i-1))]=G[1][i];
}
for(int s=1;s<(1<<n);s++) {
for(int i=1;i<=n;i++) {
int tmp=(1<<(i-1))&s;
if(tmp!=0){//如果s中有i
for(int j=1;j<=n;j++) {
tmp=(1<<(j-1))&s;
if(tmp==0&&G[i][j]!=INF) {//如果s中无j(还没经过j)且i到j有路
dp[j][s|1<<(j-1)]=Math.min(dp[j][s|1<<(j-1)], dp[i][s]+G[i][j]);
}
}
}
}
//System.out.println(dp[1][s]);
}
int ans=INF;
for(int i=1;i<=n;++i) {
if(G[i][1]!=INF) {
//System.out.println(dp[i][(1<<n)-1]);
ans=Math.min(dp[i][(1<<n)-1]+G[i][1],ans);
}
}
return ans;
}
public static void main(String args[]) {
Scanner sc=new Scanner(System.in);
T=sc.nextInt();
while(T>0) {
T--;
n=sc.nextInt();
m=sc.nextInt();
G=new int[n+1][n+1];
dp=new int[n+1][1<<n];
for(int i=0;i<=n;i++) {
for(int j=0;j<=n;j++) {
G[i][j]=INF;
}
}
for(int i=0;i<=n;i++) {
for(int j=0;j<1<<n;j++) {
dp[i][j]=INF;
}
}
//System.out.println(dp[2][1<<1]);
for(int i=0;i<m;i++) {
u=sc.nextInt();
v=sc.nextInt();
w=sc.nextInt();
G[u][v]=Math.min(G[u][v], w);
G[v][u]=Math.min(G[v][u], w);
}
floyd();
System.out.println(solve());
}
}
}
hdu5418
最新推荐文章于 2022-08-16 21:40:52 发布