测试通过 Accepted
总耗时: 201 ms
0 / 0 数据通过测试.
运行结果
测试点#1.in 结果: 内存使用量: 256kB 时间使用量: 1ms
测试点#10.in 结果: 内存使用量: 5356kB 时间使用量: 29ms
测试点#2.in 结果: 内存使用量: 256kB 时间使用量: 0ms
测试点#3.in 结果: 内存使用量: 2796kB 时间使用量: 9ms
测试点#4.in 结果: 内存使用量: 5352kB 时间使用量: 30ms
测试点#5.in 结果: 内存使用量: 5356kB 时间使用量: 29ms
测试点#6.in 结果: 内存使用量: 5356kB 时间使用量: 24ms
测试点#7.in 结果: 内存使用量: 5356kB 时间使用量: 29ms
测试点#8.in 结果: 内存使用量: 5356kB 时间使用量: 25ms
测试点#9.in 结果: 内存使用量: 5356kB 时间使用量: 25ms
错误error
测试点#1.in 结果: 内存使用量: 256kB 时间使用量: 1ms
测试点#10.in 结果: 内存使用量: 5356kB 时间使用量: 29ms
测试点#2.in 结果: 内存使用量: 256kB 时间使用量: 0ms
测试点#3.in 结果: 内存使用量: 2796kB 时间使用量: 9ms
测试点#4.in 结果: 内存使用量: 5352kB 时间使用量: 30ms
测试点#5.in 结果: 内存使用量: 5356kB 时间使用量: 29ms
测试点#6.in 结果: 内存使用量: 5356kB 时间使用量: 24ms
测试点#7.in 结果: 内存使用量: 5356kB 时间使用量: 29ms
测试点#8.in 结果: 内存使用量: 5356kB 时间使用量: 25ms
测试点#9.in 结果: 内存使用量: 5356kB 时间使用量: 25ms
错误信息
测试点#1.in 结果: 内存使用量: 256kB 时间使用量: 1ms
测试点#10.in 结果: 内存使用量: 5356kB 时间使用量: 29ms
测试点#2.in 结果: 内存使用量: 256kB 时间使用量: 0ms
测试点#3.in 结果: 内存使用量: 2796kB 时间使用量: 9ms
测试点#4.in 结果: 内存使用量: 5352kB 时间使用量: 30ms
测试点#5.in 结果: 内存使用量: 5356kB 时间使用量: 29ms
测试点#6.in 结果: 内存使用量: 5356kB 时间使用量: 24ms
测试点#7.in 结果: 内存使用量: 5356kB 时间使用量: 29ms
测试点#8.in 结果: 内存使用量: 5356kB 时间使用量: 25ms
测试点#9.in 结果: 内存使用量: 5356kB 时间使用量: 25ms
题目描述 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的直接通路时间不一定相同,也就是说道路都是单向的。
样例输入 Sample Input
3
0 1 10 10
1 0 1 2
10 1 0 10
10 2 10 0
先跑一遍floyd求最短路。dp[i][j]表示当下在j位置,状态为i的走过的最少距离。
1 #include <iostream>
2 #include <string>
3 #include <algorithm>
4 #include <cstring>
5 #include <cstdio>
6 #include <cmath>
7 #include <queue>
8 #include <set>
9 #include <map>
10 #include <list>
11 #include <vector>
12 #include <stack>
13 #define mp make_pair
14 //#define P make_pair
15 #define MIN(a,b) (a>b?b:a)
16 //#define MAX(a,b) (a>b?a:b)
17 typedef long long ll;
18 typedef unsigned long long ull;
19 const int MAX=(1<<16)+5;
20 const int MAX_V=25;
21 const int INF=2e9+5;
22 const double M=4e18;
23 using namespace std;
24 const int MOD=1e9+7;
25 typedef pair<ll,int> pii;
26 const double eps=0.000000001;
27 #define rank rankk
28 int d[MAX_V][MAX_V];//d[u][v]表示边e=(u,v)的权值(不存在时设为INF,不过d[i][i]=0
29 int V;//顶点数
30 int dp[MAX][20];
31 void warshall_floyd()
32 {
33 for(int k=0;k<V;k++)
34 for(int i=0;i<V;i++)
35 for(int j=0;j<V;j++)
36 d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
37 }
38 int main()
39 {
40 scanf("%d",&V);
41 ++V;
42 for(int i=0;i<V;i++)
43 for(int j=0;j<V;j++)
44 scanf("%d",&d[i][j]);
45 warshall_floyd();
46 for(int i=0;i<(1<<V);i++)
47 fill(dp[i],dp[i]+V,INF);
48 dp[0][0]=0;
49 for(int i=0;i<(1<<V);i++)
50 for(int j=0;j<V;j++)
51 if(!((i>>j)&1))
52 {
53 for(int q=0;q<V;q++)
54 dp[i|(1<<j)][j]=min(dp[i|(1<<j)][j],dp[i][q]+d[q][j]);
55 }
56 int da=(1<<V)-1,an=INF;
57 for(int i=0;i<V;i++)
58 an=min(an,dp[da][i]+d[i][0]);
59 printf("%d
",an);
60 }