HDU1385 Minimum Transport Cost(最短路输出路径)

题意:先给你一张你n * n的图,代表城市间的距离,然后,给出n个tax的费用,然后很多询问,问你a到b的最少费用,并且打印路径(字典序)

注意tax的费用起点和终点不算

逆序spfa:

#include<iostream>
#include<deque>
#include<vector>
#include<algorithm>
#include<list>
#include<cstdio>
using namespace std;
const int maxn=1<<7;
const int inf=0x7fffffff;
int a[maxn][maxn];
int b[maxn];
int d[maxn];
bool vis[maxn];
int pre[maxn];
int N,x,y,temp;
int out[maxn];
deque<int>q;
inline void init()
{
    for(int i=1; i<=N; i++)
    {
        d[i]=inf;
        pre[i]=inf;
        vis[i]=false;
    }
    d[y]=0;
    q.clear();
    return ;
}
void spfa()
{
    q.push_front(y);
    vis[y]=true;
    while(!q.empty())
    {
        temp=q.back();
        q.pop_back();
        for(int i=1; i<=N; i++)
        {
            if(-1 == a[i][temp] || i==temp)
            {
                continue;
            }
            else
            {
                if( d[temp] + b[i] + a[i][temp] < d[i] )
                {
                    d[i]=d[temp] + b[i] + a[i][temp];
                    pre[i]=temp;
                    if(vis[i]==false)
                    {
                        q.push_front(i);
                        vis[i]=true;
                    }
                }
                else if( d[temp] + b[i] + a[i][temp] == d[i] )
                {
                    if(temp < pre[i])
                    {
                        pre[i]=temp;
                    }
                }
            }
        }
        vis[temp]=false;
    }
    out[0]=x;
    temp=0;
    while( pre[out[temp]] != inf )
    {
        out[temp+1]=pre[out[temp]];
        temp++;
    }
    printf("From %d to %d :\nPath: ",x,y);
    for(int i=0; i<temp; i++)
    {
        printf("%d-->",out[i]);
    }
    printf("%d\n",out[temp]);
    printf("Total cost : %d\n\n",d[x]-b[x]);
    return ;
}
int main()
{
    while(cin>>N && N)
    {
        for(int i=1; i<=N; i++)
        {
            for(int j=1; j<=N; j++)
            {
                cin>>a[i][j];
            }
        }
        for(int i=1; i<=N; i++)
        {
            cin>>b[i];
        }
        while(cin>>x>>y)
        {
            if(-1==x && -1==y)
            {
                break;
            }
            if(x!=y)
            {
                init();
                spfa();
            }
            else
            {
                printf("From %d to %d :\n",x,y);
                printf("Path: %d\n",x);
                printf("Total cost : 0\n\n");
            }
        }
    }
    return 0;
}
时间: 2024-10-16 05:08:51

HDU1385 Minimum Transport Cost(最短路输出路径)的相关文章

hdu Minimum Transport Cost(按字典序输出路径)

 摘自:Think In Java 从技术角度说,OOP(面向对象程序设计)只是涉及抽象的数据类型.继承以及多形性,但另一些问题也可能显得非常重要.本节将就这些问题进行探讨.最重要的问题之一是对象的创建及破坏方式.对象需要的数据位于哪儿,如何控制对象的"存在时间"呢?针对这个问题,解决的方案是各异其趣的.C++认为程序的执行效率是最重要的一个问题,所以它允许程序员作出选择.为获得最快的运行速度,存储以及存在时间可在编写程序时决定,只需将对象放置在堆栈(有时也叫作自动或定域变量)或者静态

HDU1385 Minimum Transport Cost 【Floyd】+【路径记录】

Minimum Transport Cost Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7496    Accepted Submission(s): 1918 Problem Description These are N cities in Spring country. Between each pair of cities

HD1385Minimum Transport Cost(Floyd + 输出路径)

Minimum Transport Cost Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 9109    Accepted Submission(s): 2405 Problem Description These are N cities in Spring country. Between each pair of cities

HDU1385 Minimum Transport Cost

Minimum Transport Cost Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 9052    Accepted Submission(s): 2383 Problem Description These are N cities in Spring country. Between each pair of cities

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

题目链接 题目翻译: 有N个城市,然后直接给出这些城市之间的邻接矩阵,矩阵中-1代表那两个城市无道路相连,其他值代表路径长度. 如果一辆汽车经过某个城市,必须要交一定的钱(可能是过路费). 现在要从a城到b城,花费为路径长度之和,再加上除起点与终点外所有城市的过路费之和. 求最小花费,如果有多条路经符合,则输出字典序最小的路径. 思考 题目给的是邻接矩阵存图,而且给出X个提问.大概率用Floyd写是比较好的,字典序最小实现的话. 用Path数组实现 表示点i到j经过的第一个点 #include

HDU - 1385 Minimum Transport Cost(最短路+最小字典序路径)

题目大意:有N个村庄.过村庄时需要交一定的费用.现在问从村庄A,要运一批货物到村庄B,怎样走才能使费用达到最小,起始和终点都不用缴费 解题思路:这题借鉴了别人的思路,用字符串存储路径. 其实不用字符串也是可以处理的 #include <cstdio> #include <cstring> #include <queue> using namespace std; #define N 105 #define INF 0x3f3f3f3f struct Node { cha

hdu1385 Minimum Transport Cost 字典序最小的最短路径 Floyd

求最短路的算法最有名的是Dijkstra.所以一般拿到题目第一反应就是使用Dijkstra算法.但是此题要求的好几对起点和终点的最短路径.所以用Floyd是最好的选择.因为其他三种最短路的算法都是单源的. 输出字典序最小的路径则需要修改模版. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N =1

HDU 1385 Minimum Transport Cost(Floyd 最短路 打印路径)

HDU 1385 大意: 有N个城市,然后直接给出这些城市之间的邻接矩阵,矩阵中-1代表那两个城市无道路相连,其他值代表路径长度. 如果一辆汽车经过某个城市,必须要交一定的钱(可能是过路费). 现在要从a城到b城,花费为路径长度之和,再加上除起点与终点外所有城市的过路费之和. 求最小花费,如果有多条路经符合,则输出字典序最小的路径. 思路: Floyd求最短路,打印路径即可. 1 /*--------------------------------------------------------

hdu 1385 Minimum Transport Cost (Floyd + 字典序打印路径)

Minimum Transport Cost Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7822    Accepted Submission(s): 2028 Problem Description These are N cities in Spring country. Between each pair of cities