共有n個點,m條路徑,從任意一點出發,走完全部的點,且每一個點最多走兩邊,問最小花費spa
第一行行兩個數,n mcode
接下來m行,每行3個數,表示從u到v的花費。get
一個整數,表示最少花費。若是不能走完全部點,輸出-1string
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int inf=1000000009; int map[15][15],cst[15],f[60010][15],dp[60010][15],n,m; void init() { cst[0]=1; for(int i=1;i<=10;i++) cst[i]=cst[i-1]*3; for(int i=0;i<=cst[10];i++) { int t=i; for(int j=0;j<10;j++) f[i][j]=t%3,t/=3; } } int main() { init(); while(~scanf("%d%d",&n,&m)) { for(int i=0;i<n;i++) for(int j=0;j<n;j++) map[i][j]=inf; for(int i=1,x,y,z;i<=m;++i) { scanf("%d%d%d",&x,&y,&z),x--,y--; map[y][x]=map[x][y]=min(map[x][y], z); } for(int i=0;i<cst[n];i++) for(int j=0;j<n;j++) dp[i][j]=inf; for(int i=0;i<n;i++) dp[cst[i]][i]=0; for(int i=0;i<cst[n];i++) for(int j=0;j<n;j++) if(f[i][j]&&dp[i][j]!=inf) for(int k=0;k<n;k++) if(j!=k&&map[j][k]!=inf&&f[i][k]!=2) dp[i+cst[k]][k]=min(dp[i+cst[k]][k],dp[i][j]+map[j][k]); int ans=inf; for(int i=0;i<cst[n];i++) for(int j=0;j<n;j++) for(int k=0;k<n;k++) { if(!f[i][k]) break; if(k+1==n)ans=min(ans,dp[i][j]); } if(ans==inf) ans=-1; printf("%d\n",ans); } return 0; }