洛谷P3371单源最短路径Dijkstra版(链式前向星处理)
首先讲解一下链式前向星是什么。简单的来说就是用一个数组(用结构体来表示多个量)来存一张图,每一条边的出结点的编号都指向这条边同一出结点的另一个编号(怎么这么的绕)
如下面的程序就是存链式前向星。(不用链式前向星用邻接矩阵过不了,因为数据大会超空间限制)
struct node{
int quan,to,qian;
}lian[];
int qian[];//开始都为0,是个边界
void add(int x,int y,int z){
lian[++ans].qian=qian[x];//存前一个的编号,自己可以模拟一下很好理解的
lian[ans].quan=z;//存对应的比边权
lian[ans].to=y;//与之相连的点是哪一个存下来
qian[x]=ans;//变成当前编号方便存下一个
}
学会了链式前向星,接下来就是Dijkstra算法。
Dijkstra算法是基于贪心的算法,它是寻找每一点相连的边的最小值,在对整个图进行更新,做n-1次,也可以认为是一种动态规划,但不适用于有负边的情况,以后我会对它进行堆优化,现在用的Dijkstra是未经优化的版本。
在很多高级算法的书上都会提到,我就不画图和证明正确性了,借助程序讲
1 #include<bits/stdc++.h>
2 using namespace std;
struct node{
int quan,to,qian;
}lian[];
int n,m,s,dis[],ans,qian[];
bool vis[];
void add(int x,int y,int z){
lian[++ans].qian=qian[x];
lian[ans].quan=z;
lian[ans].to=y;
qian[x]=ans;
}//链式前向星存储
void dijkstra(){
memset(vis,false,sizeof(vis));
memset(dis,0x3f,sizeof(dis));
dis[s]=;
int now=s;
vis[s]=true for (int i=;i<n;i++){//要将整张图寻找,所以要找n-1次
vis[now]=true;//记录是否已经遍历过
int p=qian[now];
while (p!=){//边界是0前面已经说明,要自己理解
if (not vis[lian[p].to]&&(lian[p].quan+dis[now]<dis[lian[p].to]))
dis[lian[p].to]=lian[p].quan+dis[now];
p=lian[p].qian;
} //链式前向星寻找,每次更新没有遍历过的点的最小值
int minn=0x7fffffff;
for (int j=;j<=n;j++)
if (not vis[j]&&dis[j]<minn){
minn=dis[j];
now=j;//找最小的没遍历的点继续更新
}
}
}
int main(){
scanf("%d%d%d",&n,&m,&s);
for (int i=;i<=m;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);//处理读入数据
}
dijkstra();
for (int i=;i<=n;i++){
if (dis[i]>) printf("%d ",);
else printf("%d ",dis[i]);//输出结果
}
}
洛谷P3371单源最短路径Dijkstra版(链式前向星处理)的更多相关文章
- 洛谷P3371单源最短路径Dijkstra堆优化版及优先队列杂谈
其实堆优化版极其的简单,只要知道之前的Dijkstra怎么做,那么堆优化版就完全没有问题了. 在做之前,我们要先学会优先队列,来完成堆的任务,下面盘点了几种堆的表示方式. priority_queue ...
- 洛谷P3371单源最短路径SPFA算法
SPFA同样是一种基于贪心的算法,看过之前一篇blog的读者应该可以发现,SPFA和堆优化版的Dijkstra如此的相似,没错,但SPFA有一优点是Dijkstra没有的,就是它可以处理负边的情况. ...
- 洛谷 P4779 单源最短路径(标准版) 题解
题面 这道题就是标准的堆优化dijkstra: 注意堆优化的dijkstra在出队时判断vis,而不是在更新时判断vis #include <bits/stdc++.h> using na ...
- SPFA板子 (背景:Luogu P3371 单源最短路径)
Luogu P3371 单源最短路径 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数 ...
- 单源最短路径Dijkstra算法,多源最短路径Floyd算法
1.单源最短路径 (1)无权图的单源最短路径 /*无权单源最短路径*/ void UnWeighted(LGraph Graph, Vertex S) { std::queue<Vertex&g ...
- 单元最短路径算法模板汇总(Dijkstra, BF,SPFA),附链式前向星模板
一:dijkstra算法时间复杂度,用优先级队列优化的话,O((M+N)logN)求单源最短路径,要求所有边的权值非负.若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的 ...
- 【最短路】Dijkstra+ 链式前向星+ 堆优化(优先队列)
Dijkstra+ 链式前向星+ 优先队列 Dijkstra算法 Dijkstra最短路算法,个人理解其本质就是一种广度优先搜索.先将所有点的最短距离Dis[ ]都刷新成∞(涂成黑色),然后从起点 ...
- HDU 2544最短路 【dijkstra 链式前向星+优先队列优化】
最开始学最短路的时候只会用map二维数组存图,那个时候还不知道这就是矩阵存图,也不懂得效率怎么样 经过几个月的历练再回头看最短路的题, 发现图可以用链式前向星来存, 链式前向星的效率是比较高的.对于查 ...
- Floyd && Dijkstra +邻接表 +链式前向星(真题讲解来源:城市路)
1381:城市路(Dijkstra) 时间限制: 1000 ms 内存限制: 65536 KB提交数: 4066 通过数: 1163 [题目描述] 罗老师被邀请参加一个舞会,是 ...
随机推荐
- 使用工具自动生成Linq类文件
第一部:运行cmd. 执行命令 cd C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools 第二步:执行 ...
- BZOJ 1053 [HAOI2007]反素数ant 神奇的约数
本蒟蒻终于开始接触数学了...之前写的都忘了...忽然想起来某神犇在几个月前就切了FWT了... 给出三个结论: 1.1-N中的反素数是1-N中约数最多但是最小的数 2.1-N中的所有数的质因子种类不 ...
- POJ - 3450
题目链接:http://poj.org/problem?id=3450 Corporate Identity Time Limit: 3000MS Memory Limit: 65536K Tot ...
- Regionals 2014 >> Asia - Taichung 7003 - A Balance Game on Trees 树形DP + 二维费用背包
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- (转)Web服务器磁盘满故障深入解析
Web服务器磁盘满故障深入解析 原文:http://blog.51cto.com/oldboy/612351 ############################################# ...
- Windows安全认证是如何进行的?[Kerberos篇]
最近一段时间都在折腾安全(Security)方面的东西,比如Windows认证.非对称加密.数字证书.数字签名.TLS/SSL.WS-Security等.如果时间允许,我很乐意写一系列的文章与广大网友 ...
- centos6安装bochs
安装包 bochs 2.6.8 平台 centos6 前提依赖 yum groupinstall -y "Server Platform Development" "De ...
- iShow UI for React 最佳实践
React 与 AJAX React只负责处理View这一层,它本身不涉及网络请求/AJAX,所以这里我们需求考虑两个问题: 第一,用什么技术从服务端获取数据: 第二,获取到的数据应该放在react组 ...
- jQuery获取url
JS获取当前页面的URL信息 设置或获取对象指定的文件名或路径. <script> alert(window.location.pathname) </script> 设置或获 ...
- C 碎片十 关键字&库函数
一.关键字 1, sizeof sizeof关键字用于计算所占空间大小的 格式:sizeof(类型名/变量名); 2, typedef typedef关键字用于重命名数据类型的,相当于给原来的数据类型 ...