徐州免费网站建站模板/广州百度网站快速排名
某乡有n个村庄(1< n < 20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0 < s < 1000)是已知的,且A村到B村与B村到A村的路大多不同。为了提高效率,他从商店出发到每个村庄一次,然后返回商店所在的村,假设商店所在的村庄为 1,他不知道选择什么样的路线才能使所走的路程最短。请你帮他选择一条最短的路。
输入
村庄数n和各村之间的路程(均是整数)。
输出
最短的路程
样例输入
3 {村庄数}
0 2 1 {村庄1到各村的路程}
1 0 2 {村庄2到各村的路程}
2 1 0 {村庄3到各村的路程}
样例输出
3
#include<stdio.h>
#include<string.h>
#include<math.h>
#define min(a,b) a<b?a:b
int n;
int q[21][21];
int dp[21][40000];
int main()
{int i,j;scanf("%d",&n);for(i=1;i<=n;i++){for(j=1;j<=n;j++){scanf("%d",&q[i][j]);}}int x,u,v;memset(dp,64,sizeof(dp));dp[1][1]=0;for(x=0;x<=(1<<n);x++){for(u=1;u<=n;u++){if(((1<<(u-1))&x)==0){for(v=1;v<=n;v++){if((1<<v-1)&x){dp[u][1<<u-1|x]=min(dp[u][1<<u-1|x],dp[v][x]+q[v][u]);}}}}}int ans=100000000;for(int i=2;i<=n;i++) {ans=min(ans,dp[i][(1<<n)-1]+q[i][1]);} printf("%d\n",ans);return 0;}