共有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; }