HDU - 1385 Minimum Transport Cost(floyd+字典序)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU - 1385 Minimum Transport Cost(floyd+字典序)相关的知识,希望对你有一定的参考价值。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1385

题意:给出一个邻接矩阵(对应位置的值代表两个顶点之间的花费),并且到达另外一个位置还要加上那个位置对应的额外花费。

然后求出最少的花费和起点到终点的路径(如果两条路径花费一样,求出字典序最小的)

求任意两点间的最小花费,一般都采用Floyd。Floyd就是一个简单的dp思想,在用Floyd的时候记录一下路径就可以了。

这里要求字典序,可以在路径相等的时候再次进行判断一下,取小的顺序。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int INF=0x3f3f3f3f;
 5 const int N=1111;
 6 int dp[N][N],path[N][N],c[N];
 7 int n;
 8 
 9 void floyd(){
10     //k代表转折点 
11     for(int k=1;k<=n;k++){
12         for(int i=1;i<=n;i++){
13             for(int j=1;j<=n;j++){
14                 if(dp[i][j]>dp[i][k]+dp[k][j]+c[k])
15                 {
16                     dp[i][j]=dp[i][k]+dp[k][j]+c[k];
17                     path[i][j]=path[i][k];                
18                 }
19                 else if(dp[i][j]==dp[i][k]+dp[k][j]+c[k])
20                 {
21                     if(path[i][j]>path[i][k]){
22                         path[i][j]=path[i][k];
23                         dp[i][j]=dp[i][k]+dp[k][j]+c[k];
24                     }
25                 }
26             }
27         }
28     }
29     
30 }
31 
32 void print_path(int s,int t){
33     if(s==t) return;
34     printf("-->%d",path[s][t]);
35     int k=path[s][t];
36     print_path(k,t);
37 }
38 
39 int main(){
40     int s,t;
41     
42     while(cin>>n&&n!=0)
43     {
44         for(int i=1;i<=n;i++)
45         {
46             for(int j=1;j<=n;j++)
47             {    
48                 path[i][j]=j;
49                 scanf("%d",&dp[i][j]);
50                 if(dp[i][j]==-1) dp[i][j]=INF;
51             }    
52         }
53         
54         for(int i=1;i<=n;i++) scanf("%d",&c[i]);
55         floyd();
56         while(cin>>s>>t){
57             if(s==-1&&t==-1) break;
58             printf("From %d to %d :\n",s,t);
59             printf("Path: %d",s);
60             print_path(s,t);
61             printf("\nTotal cost : %d\n\n",dp[s][t]);
62         }
63         
64         
65     }
66     return 0;
67 }

 

以上是关于HDU - 1385 Minimum Transport Cost(floyd+字典序)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 1385 Minimum Transport Cost

[floyd+路径输出]HDU1385 Minimum Transport Cost

HDU 1385 Minimum Transport Cost (输出字典序最小路径)最短路

堆优化Dijkstra+字典序最短路方案HDU1385-Minimum Transport Cost

*HDU 1385 最短路 路径

Floyd算法——保存路径——输出路径 HDU1385