题目描述 Description
有一个送外卖的,他手上有n份订单,他要把n份东西,分别送达n个不同的客户的手上。n个不同的客户分别在1~n个编号的城市中。送外卖的从0号城市出发,然后n个城市都要走一次(一个城市可以走多次),最后还要回到0点(他的单位),请问最短时间是多少。现在已知任意两个城市的直接通路的时间。
输入描述 Input Description
第一行一个正整数n (1<=n<=15)
接下来是一个(n+1)*(n+1)的矩阵,矩阵中的数均为不超过10000的正整数。矩阵的i行j列表示第i-1号城市和j-1号城市之间直接通路的时间。当然城市a到城市b的直接通路时间和城市b到城市a的直接通路时间不一定相同,也就是说道路都是单向的。
输出描述 Output Description
一个正整数表示最少花费的时间
样例输入 Sample Input
3 0 1 10 10 1 0 1 2 10 1 0 10 10 2 10 0
样例输出 Sample Output
8
数据范围及提示 Data Size & Hint
1<=n<=15
分类标签 Tags 点此展开
2800 送外卖 | 略懂_is_a_Joker | 100 | 372ms | 8 MB | C++ | 861B | 2015/10/10 21:51:28 |
---|
#include<stdio.h>
#include<string.h>
#define min(a,b) (a>b?b:a)
#define INF 0x3f3f3f3f
int map[17][17];
int dp[1<<17][17];
int n;
void floyd()
{
int i,j,k;
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
for(k=0;k<=n;k++)
{
map[i][j]=min(map[i][j],map[i][k]+map[k][j]);
}
}
int main()
{
// int n;
while(scanf("%d",&n)!=EOF)
{
int i,j,k;
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
scanf("%d",&map[i][j]);
// memset(map,INF,sizeof(map));
memset(dp,INF,sizeof(dp));
floyd();
int rt=(1<<n+1)-1;
dp[0][0]=0;
for(i=0;i<=rt;i++)
{
for(j=0;j<=n;j++)
{
if(dp[i][j]==INF)
continue;
for(k=0;k<=n;k++)
{
if(i&(1<<k))
continue;
int st=i|(1<<k);
dp[st][k]=min(dp[st][k],dp[i][j]+map[j][k]);
}
}
}
printf("%d\n",dp[rt][0]);
}
}
2800 送外卖 | 略懂_is_a_Joker | 100 | 372ms | 8 MB | C++ | 861B | 2015/10/10 21:51:28 |
---|