PAT---1030 Travel Plan(迪杰斯特拉,记录最短路径)_风吹草地现牛羊的马的博客-程序员秘密

技术标签: ACM  

题意:输出最短路径,若最短路径相同,则输出代价最小的路径。
思路:迪杰斯特拉算法,用path数组记录最短路径,path[a] = b,表示从源s到b的最短路径中,最后一跳是通过a到b的。故输出时,应该用栈将b入栈后,依次将path[]数组从后往前遍历进栈。然后输出栈即可。

#include <iostream>
#include <vector>
#include <cstring>
#include <stack>

using namespace std;

struct Node
{
    
    int next, dis, cost;
};

vector<Node> edges[501];
bool visited[501];
int dist[501];
int cost[501];     //记录花费
int path[501];    //记录路径

void print(int d)
{
    
    stack<int> S;
    S.push(d);
    int pre = path[d];
    while(pre != -1)
    {
    
        S.push(pre);
        pre = path[pre];
    }
    while(!S.empty())
    {
    
        cout << S.top() << " ";
        S.pop();
    }
}

void Dij(int n, int s)
{
    
    memset(visited, 0 , sizeof(visited));
    for(int i = 0; i < n; i++)
    {
    
        dist[i] = -1;
        cost[i] = 0;
        path[i] = -1;
    }

    visited[s] = true;
    dist[s] = 0;
    int newp = s;
    for(int i = 0; i < n-1; i++)
    {
    
        //松弛操作
        for(int j = 0; j < edges[newp].size(); j++)
        {
    
            int next = edges[newp][j].next;
            int len = edges[newp][j].dis;
            int weight = edges[newp][j].cost;

            //最短路径不止一条
            if(dist[next] == dist[newp]+len)
            {
    
                if(cost[next] > cost[newp] + weight)
                {
    
                    cost[next] = cost[newp] + weight;
                    path[next] = newp;
                }
            }

            if(dist[next] == -1 || dist[newp]+len < dist[next])
            {
    
                dist[next] = dist[newp] + len;
                cost[next] = cost[newp] + weight;
                path[next] = newp;
            }
        }
        //找下一个newp
        int min = 111111111;
        for(int j = 0; j < n; j++)
        {
    
            if(visited[j] || dist[j] == -1)
                continue;
            if(dist[j] < min)
            {
    
                min = dist[j];
                newp = j;
            }
        }
        visited[newp] = true;
    }
}

int main()
{
    
    int n, m, s, d;
    cin >> n >> m >> s >> d;
    int a, b, x, y;
    for(int i = 0; i < m; i++)
    {
    
        Node tmp;
        cin >> a >> b >> x >> y;
        tmp.next = b, tmp.dis = x, tmp.cost = y;
        edges[a].push_back(tmp);
        tmp.next = a;
        edges[b].push_back(tmp);
    }
    
    Dij(n, s);
    print(d);
    cout << dist[d] << " " << cost[d] << endl;
    return 0;
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/mch2869253130/article/details/88124595

智能推荐

MediaRecorder.AudioSource参数_bangan1464的博客-程序员秘密

MediaRecorder.AudioSource.DEFAULT 默认音频源VOICE_CALL︰设定录音来源为语音拨出的语音与对方说话的声音。MIC︰设定录音来源为麦克风。CAMCORDER︰设定录音来源与同方向的相机麦克风相同,若相机无内置相机或无法设定时,则使用预设的麦克风。VOICE_COMMUNICATION摄像头旁边的麦克风VOICE_DOWNLINK:下...

量子算法、DNA计算与后经典计算时代_人工智能学家的博客-程序员秘密

来源:资本实验室二进制与伟大的计算机相结合,推动人类进入了信息化时代。在这个基于物质世界的,由0和1构成的新世界中,我们依靠算法和电子技术不断解决了大量曾经无法解决的问题...

#include<>和#include“”的区别_include <>_清明庐州月的博客-程序员秘密

1、查找的路径不同(1)#include&lt;&gt;:编译器直接从系统类库目录里查找头文件,比如在VS2013中:#include&lt;stdio.h&gt;那么编译器会直接在&lt;Visual studio安装目录&gt;\VC\include目录下查找到stdio.h这个文件,这就是编译器的类库目录。如果类库目录下查找失败,编译器会终止查找,直接报错:No such file or directore.(2)#include"":默认从项目当前目录查找头文件,.

关于多态的理解_qq_43582180的博客-程序员秘密

关于多态的理解1. 什么是多态?2.使用多态的前提3.通过代码来理解多态的特性总结1. 什么是多态?多态是指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。多态也称作动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。通俗地讲,只通过父类就能够引用不同的子类,这就是多态,我们只有...

一文尽览5G全产业链及新机遇_人工智能学家的博客-程序员秘密

来源:5G产业圈5G牌照的发放,对通信产业发展具有重要的战略意义。这不仅仅是为了5G商用,更赋予了多重目的。比如为了利用5G技术推动经济结构创新、促进经济增长、帮助华为中...

FRM-40654(记录已经被另一个用户更新,重新查询以查看修改)_suniangu的博客-程序员秘密

Oracle Form在开发时,有时会出现假锁--Forms 抛出FRM-40654(记录已经被另一个用户更新,重新查询以查看修改).这个问题也曾经折磨了我好久。总结出几点供大家参考看一看,还有没有写出的情况,请大家指点    1. 四舍五入    2.数据块中的某些项目的公式与视图中的公式不一致    3.数据块中的项目要设置主键是要唯一组合    4.数据块中的项目默认了值,而

随便推点

unity Shader复杂光照_unity面光40_勤学者闯天涯的博客-程序员秘密

一、渲染路径1、unity支持的渲染路径:前向渲染路径(Forword)、延迟渲染路径(Deferred)、顶点照明渲染路径(Vertex Lit)。2、可以在项目上设置、也可以在摄相机上设置或者在Shader上设置,在shader上利用LightMode标签实现。3、Pass的LightMode标签支持的渲染路径设置选项。LightMode标签支持的渲染路径设置选项 标签名 ...

算法成长之路------CF22A Second Order Statistics_Licodeao的博客-程序员秘密

学习目标:算法学习-Day16题库: 洛谷题库每天保持发布一篇Java或C算法题解!题目:给定一个数组,输出其中第二小的整数(相等的整数只计算一次)。输入格式:第一行,一个整数 n(1≤n≤100),表示数组长度。第二行,n 个绝对值小于 100 的整数。输出格式:一行。如果该数组存在第二小整数,则输出第二小整数。如果不存在,则输出NO。样例 1 :输入:41 2 2 -4输出:1样例 2 :输入:51 2 3 1 1输出:2思路: 题目要求输出第二小整

CentOS安装JDK_JLongZhan的博客-程序员秘密

CentOS7 JDK 安装下载JDKhttp://www.oracle.com/technetwork/java/javase/downloads/index.html 选择合适的版本解压安装将压缩包上传到服务器上,然后进行解压 tar -zxvf jdk-8u161-linux-x64.tar.gz 创建文件夹保存mkdir /usr/local/j...

GAT学习:PyG实现GAT(自定义GAT层)网络(四)_pyg gat_StarfishCu的博客-程序员秘密

PyG实现自定义GAT层完整代码代码分析本系列中的第三篇介绍了如何调用pyg封装好的GAT函数,当然同样的,对于科研需求,我们同样需要学会如何自定义网络层以满足研究需求。完整代码import torchimport mathfrom torch_geometric.nn import MessagePassingfrom torch_geometric.utils import add_self_loops,remove_self_loops,softmaxfrom torch_geometr

MATLAB统计工具箱_一步一个脚印的屌丝的博客-程序员秘密

转自:http://blog.163.com/hulin_feng/blog/static/923525320122270442267/MATLAB统计工具箱包括概率分布、方差分析、假设检验、分布检验、非参数检验、回归分析、判别分析、主成分分析、因子分析、系统聚类分析、K均值聚类分析、试验设计、决策树、多元方差分析、统计过程控制和统计图形绘制等。优化工具箱包括无约束最优化、有约束最优化、二次规