(状压dp)codevs2800 送外卖

2800 送外卖

 

时间限制: 2 s
空间限制: 256000 KB
题目等级 : 钻石 Diamond

测试通过 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的直接通路时间不一定相同,也就是说道路都是单向的。

输出描述 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

 

先跑一遍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\n",an);
60 }

 

posted @ 2017-06-07 16:15  perplex  阅读(163)  评论(0编辑  收藏  举报