博客
关于我
最短路 dijkstra 学习、代码实现
阅读量:395 次
发布时间:2019-03-05

本文共 3404 字,大约阅读时间需要 11 分钟。

1. 概述

dijkstra 单源最短路, 单源最短路即把一个点当作源点,求得这个点到其它点的最短路。

算法的基本思路:

首先用一个辅助数组 pos[ ], pos[i] 就是源点到 结点 i 的最短距离,如果邻接矩阵存储,pos[ ] 也就是 a[i][ ]。一个标记数组vis[], vis[i] 为 true 则已经找到源点到这个点的最短距离,为false则还未确定源点到这个点的最短距离,假设源点编号为sta,vis[sta] 初始为true ,因为源点到源点距离肯定为 0。

(1)从pos[ ]中找到离未标记且距离源点最近(即pos[]值最小)的一个点,标记这个节点,然后用这个点去更新pos[] 中的其他结点 。

例如:pos[3]未标记且pos[3] 最小,那么pos[3] 就是源点到结点3的最短距离,标记这个节点,然后用这个点去更新其他 pos[] 中节点,这里的更新指的是源点通过节点3到达其他节点的距离,距离小于当前的辅助数组中的值则更新,否则不更新辅助数组。

(2)更新 n-1 次之后(假设源点可达所有节点),pos[] 中即源点到达其他节点的最短路。

2.  代码实现

// 最短路 dijkstra// 时间复杂度:n^2, n 为 节点数#include 
#include
const int INF = 1000000007;const int N = 1010;// 存储图, a[i][j] 是节点 i 到 节点 j 的 距离int a[N][N];// point[i].vis = 1 已经找到 起始点 到 节点i 的最短距离// point[i].vis = 0 还没有找到 起始点 到 节点i 的最短距离// point[i].dis, 起始点 到 节点i 的最短距离typedef struct point { int vis, dis;}P;P pos[N];// 节点总数为 n, 节点编号从 1 开始, sta 为起始点编号void Dijkstra(int n, int sta) { // 初始化 pos[N] for(int i=1; i<=n; i++) { pos[i].vis = 0; pos[i].dis = a[sta][i]; } pos[sta].vis = 1, pos[sta].dis = 0; for(int i=2; i<=n; i++) { // minDist 起始点到未找到最短距离的节点的最短距离 // minj 存储每一次找到节点的 编号 int minDist = INF, minj = -1; // 寻找起始点到未找到最短距离的节点的最短距离 for(int j=1; j<=n; j++) { if(0==pos[j].vis && pos[j].dis

3.  代码验证:poj  1062   昂贵的聘礼

       题目传送:

                                                                                       昂贵的聘礼

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 51393   Accepted: 15384

Description

年轻的探险家来到了一个印第安部落里。在那里他和酋长的女儿相爱了,于是便向酋长去求亲。酋长要他用10000个金币作为聘礼才答应把女儿嫁给他。探险家拿不出这么多金币,便请求酋长降低要求。酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币。如果你能够弄来他的水晶球,那么只要5000金币就行了。"探险家就跑到大祭司那里,向他要求皮袄或水晶球,大祭司要他用金币来换,或者替他弄来其他的东西,他可以降低价格。探险家于是又跑到其他地方,其他人也提出了类似的要求,或者直接用金币换,或者找到其他东西就可以降低价格。不过探险家没必要用多样东西去换一样东西,因为不会得到更低的价格。探险家现在很需要你的帮忙,让他用最少的金币娶到自己的心上人。另外他要告诉你的是,在这个部落里,等级观念十分森严。地位差距超过一定限制的两个人之间不会进行任何形式的直接接触,包括交易。他是一个外来人,所以可以不受这些限制。但是如果他和某个地位较低的人进行了交易,地位较高的的人不会再和他交易,他们认为这样等于是间接接触,反过来也一样。因此你需要在考虑所有的情况以后给他提供一个最好的方案。 

为了方便起见,我们把所有的物品从1开始进行编号,酋长的允诺也看作一个物品,并且编号总是1。每个物品都有对应的价格P,主人的地位等级L,以及一系列的替代品Ti和该替代品所对应的"优惠"Vi。如果两人地位等级差距超过了M,就不能"间接交易"。你必须根据这些数据来计算出探险家最少需要多少金币才能娶到酋长的女儿。 

Input

输入第一行是两个整数M,N(1 <= N <= 100),依次表示地位等级差距限制和物品的总数。接下来按照编号从小到大依次给出了N个物品的描述。每个物品的描述开头是三个非负整数P、L、X(X < N),依次表示该物品的价格、主人的地位等级和替代品总数。接下来X行每行包括两个整数T和V,分别表示替代品的编号和"优惠价格"。

Output

输出最少需要的金币数。

Sample Input

1 410000 3 22 80003 50001000 2 14 2003000 2 14 20050 2 0

Sample Output

5250

解题思路:

     把冒险者当作点1, 酋长往后的点依次后推, 求点1 到 点2 的最短距离, 把每一个人,都当成最高等级的,然后用 dijkstra去求, 不断更新最优解。

代码:

// poj 1062#include 
#include
const int INF = 1000000007;const int N = 1010;// 设置冒险者的编号为 1, 所有的物品编号从 2 开始// a[1][j] 冒险家购买 物品 j 所需金币// a[i][j] 使用物品 i 后 购买 物品 j 所需 金币数int a[N][N], level[N];typedef struct point { int vis, dis;}P;P pos[N];// 节点总数为 n, 节点编号从 1 开始, sta 为起始点编号void Dijkstra(int n, int sta) { // 初始化 pos[N] for(int i=1; i<=n; i++) { //pos[i].vis = 0; pos[i].dis = a[sta][i]; } pos[sta].vis = 1, pos[sta].dis = 0; for(int i=2; i<=n; i++) { // minDist 起始点到未找到最短距离的节点的最短距离 // minj 存储每一次找到节点的 编号 int minDist = INF, minj = -1; // 寻找起始点到未找到最短距离的节点的最短距离 for(int j=1; j<=n; j++) { if(0==pos[j].vis && pos[j].dis
m || level[i]>level[j]) { pos[j].vis = 1; } else { pos[j].vis = 0; } } Dijkstra(n+1, 1); if(pos[2].dis < ans) { ans = pos[2].dis; } } printf("%d\n", ans); return 0;}

 

转载地址:http://qdkzz.baihongyu.com/

你可能感兴趣的文章
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_生成插入Sql语句_实际操作02---大数据之Nifi工作笔记0041
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_不带分页处理_01_QueryDatabaseTable获取数据_原0036---大数据之Nifi工作笔记0064
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_无分页功能_02_转换数据_分割数据_提取JSON数据_替换拼接SQL_添加分页---大数据之Nifi工作笔记0037
查看>>
NIFI从Oracle11G同步数据到Mysql_亲测可用_解决数据重复_数据跟源表不一致的问题---大数据之Nifi工作笔记0065
查看>>
NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
查看>>
nifi使用过程-常见问题-以及入门总结---大数据之Nifi工作笔记0012
查看>>
NIFI分页获取Mysql数据_导入到Hbase中_并可通过phoenix客户端查询_含金量很高的一篇_搞了好久_实际操作05---大数据之Nifi工作笔记0045
查看>>
NIFI分页获取Postgresql数据到Hbase中_实际操作---大数据之Nifi工作笔记0049
查看>>
NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
查看>>
NIFI同步MySql数据源数据_到原始库hbase_同时对数据进行实时分析处理_同步到清洗库_实际操作06---大数据之Nifi工作笔记0046
查看>>
Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
查看>>
【Flink】Flink 1.9 版本 web UI 突然没有日志
查看>>
NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
查看>>
NIFI大数据进阶_FlowFile生成器_GenerateFlowFile处理器_ReplaceText处理器_处理器介绍_处理过程说明---大数据之Nifi工作笔记0019
查看>>
NIFI大数据进阶_FlowFile生成器_GenerateFlowFile处理器_ReplaceText处理器_实际操作---大数据之Nifi工作笔记0020
查看>>
NIFI大数据进阶_Json内容转换为Hive支持的文本格式_实际操作_02---大数据之Nifi工作笔记0032
查看>>