博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
L2-001 紧急救援 [Dijkstra]
阅读量:4358 次
发布时间:2019-06-07

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

这题是一道给我这个菜鸡复习Dijkstra的好题。

因为要求比较多,先把大致需要的数组罗列一下。

dis[]记录最短路

path[]记录路径

pnum[]记录最短路数目

cnt[]记录最多人数

vis[]记录是否走过这个点

首先需要将vis和cnt置零,dis置∞(用邻接矩记录边也要记得置∞)

接着对起始点初始化,dis[s]=0;path[s]=-1;pnum[s]=1;cnt[s]=s点人数;

从每个点开始,先遍历所有点,如果找到一个没有被访问过的并且距离更近的点,将这点作为起点,进行松弛操作

松弛操作有两种情况,一种是距离较大的情况,更新各个数组即可。如果距离相等,要将两者的pnum[]和cnt[]相加。

因为用了数组记录最短路的每个点前一个节点,所以打印路径递归即可,详见代码

#include 
#include
#include
#include
#include
#include
#include
#include
#define maxn 605#define INF 0x3f3f3f3fusing namespace std;typedef long long ll;int num[maxn],dis[maxn],path[maxn],pnum[maxn],vis[maxn];int ma[maxn][maxn];int n,m,s,d,u,v,w;int cnt[maxn];void dijkstra(){ memset(vis,0,sizeof(vis)); memset(cnt,0,sizeof(cnt)); for(int i=0;i
dis[t]+ma[t][j]) { dis[j]=dis[t]+ma[t][j]; path[j]=t; cnt[j]=cnt[t]+num[j]; pnum[j]=pnum[t]; } else if(dis[j]==dis[t]+ma[t][j]) { pnum[j]+=pnum[t]; if(cnt[j]
View Code

 

转载于:https://www.cnblogs.com/FTA-Macro/p/10499725.html

你可能感兴趣的文章
[算法]分治算法(Divide and Conquer)
查看>>
mssql格式化工具——SQL PRETTY PRINTER
查看>>
datagrid删除按钮
查看>>
Redis高级进阶(一)
查看>>
地图坐标助手-开发总结
查看>>
Android资源--颜色RGB值以及名称及样图
查看>>
ORA-32001:write to SPFILE requested but no SPFILE is in use
查看>>
PhysX入门教程(全)
查看>>
ASP.NET XML与JSON
查看>>
java.lang.Class.getResource()这哥个方法主要是做什么用
查看>>
Codeforces 948D Perfect Security 【01字典树】
查看>>
android中通过ServerSocket创建端口问题
查看>>
fieldset、legend、display html元素
查看>>
IntelliJ IDEA 14.x 与 Tomcat 集成,创建并运行Java Web项目
查看>>
JavaWeb学习-Tomcat
查看>>
MySQL 事务与锁机制
查看>>
优秀程序员==工作时间长的程序员么?
查看>>
docker学习笔记2:容器操作
查看>>
深入浅出设计模式——访问者模式(Visitor Pattern)
查看>>
【转载】zookeeper 分布式锁 实现
查看>>