首先讲解一下链式前向星是什么。简单的来说就是用一个数组(用结构体来表示多个量)来存一张图,每一条边的出结点的编号都指向这条边同一出结点的另一个编号(怎么这么的绕

如下面的程序就是存链式前向星。(不用链式前向星用邻接矩阵过不了,因为数据大会超空间限制)

 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版(链式前向星处理)的更多相关文章

  1. 洛谷P3371单源最短路径Dijkstra堆优化版及优先队列杂谈

    其实堆优化版极其的简单,只要知道之前的Dijkstra怎么做,那么堆优化版就完全没有问题了. 在做之前,我们要先学会优先队列,来完成堆的任务,下面盘点了几种堆的表示方式. priority_queue ...

  2. 洛谷P3371单源最短路径SPFA算法

    SPFA同样是一种基于贪心的算法,看过之前一篇blog的读者应该可以发现,SPFA和堆优化版的Dijkstra如此的相似,没错,但SPFA有一优点是Dijkstra没有的,就是它可以处理负边的情况. ...

  3. 洛谷 P4779 单源最短路径(标准版) 题解

    题面 这道题就是标准的堆优化dijkstra: 注意堆优化的dijkstra在出队时判断vis,而不是在更新时判断vis #include <bits/stdc++.h> using na ...

  4. SPFA板子 (背景:Luogu P3371 单源最短路径)

    Luogu P3371 单源最短路径 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数 ...

  5. 单源最短路径Dijkstra算法,多源最短路径Floyd算法

    1.单源最短路径 (1)无权图的单源最短路径 /*无权单源最短路径*/ void UnWeighted(LGraph Graph, Vertex S) { std::queue<Vertex&g ...

  6. 单元最短路径算法模板汇总(Dijkstra, BF,SPFA),附链式前向星模板

    一:dijkstra算法时间复杂度,用优先级队列优化的话,O((M+N)logN)求单源最短路径,要求所有边的权值非负.若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的 ...

  7. 【最短路】Dijkstra+ 链式前向星+ 堆优化(优先队列)

    Dijkstra+ 链式前向星+ 优先队列   Dijkstra算法 Dijkstra最短路算法,个人理解其本质就是一种广度优先搜索.先将所有点的最短距离Dis[ ]都刷新成∞(涂成黑色),然后从起点 ...

  8. HDU 2544最短路 【dijkstra 链式前向星+优先队列优化】

    最开始学最短路的时候只会用map二维数组存图,那个时候还不知道这就是矩阵存图,也不懂得效率怎么样 经过几个月的历练再回头看最短路的题, 发现图可以用链式前向星来存, 链式前向星的效率是比较高的.对于查 ...

  9. Floyd && Dijkstra +邻接表 +链式前向星(真题讲解来源:城市路)

    1381:城市路(Dijkstra) 时间限制: 1000 ms         内存限制: 65536 KB提交数: 4066     通过数: 1163 [题目描述] 罗老师被邀请参加一个舞会,是 ...

随机推荐

  1. linux shell 脚本 历史文件清理脚本,按天,按月,清理前N天的历史文件,删除指定大小历史文件,历史文件归档清理

    不知道大家那有没有要清理的这个事情.需要清理目录历史文件.可能后续也会有很多其他地方需要清理历史文件,可能会用到. 我这两天空闲写了个脚本,清理比较方便,有要进行清理的大量历史文件的话可以用. 脚本用 ...

  2. chapter06

    /** * Created by EX-CHENZECHAO001 on 2018-03-30. */class Chapter06 { } // 6 对象// 用对象作为单例或存放工具的方法// 类 ...

  3. bitnami-redmine Apache服务启动不起来

    方法一: 通过 netstat -a -o 查看端口占用情况,关闭调用相关端口的进程.  c:\> netstat -a -o  Active Connections  Proto  Local ...

  4. 04.Spring Ioc 容器 - 刷新

    基本概念 Spring Ioc 容器被创建之后,接下来就是它的初始化过程了.该过程包含了配置.刷新两个步骤 . 刷新由 Spring 容器自己实现,具体发生在 ConfigurableApplicat ...

  5. leetcode--Learn one iterative inorder traversal, apply it to multiple tree questions (Java Solution)

    will show you all how to tackle various tree questions using iterative inorder traversal. First one ...

  6. 【Java密码学】用Java数字签名提供XML安全

    简介 众所周知,XML在产品和项目开发中起着非常重要的作用.通过XML文档可以获取很多信息,还可以使用XML文件进行CRUD(增加.查询.更新和删除)操作.然而值得注意的是,我们如何确保XML中的数据 ...

  7. SQLServer2008 开启远程连接

    关闭防火墙 基本的设置可以参考下面的链接: http://wenku.baidu.com/link?url=qjZKZCCoa5T3EGd_rqSjl6Tuhb1wYjIHyXri630QxuAIKu ...

  8. devExpress GridControl gridView笔记

    gridView1.Appearance.EvenRow.BackColor = Color.FromArgb(, , , ); gridView1.Appearance.OddRow.BackCol ...

  9. [技术交流ppt]babel7中preset-env的优化使用

    备注 pdf在这里

  10. SpringBoot的优缺点

    优点: 1.快速构建项目 2.对主流开发框架的无配置继承 3.项目可独立运行,无须外部依赖Servlet容器 4.提高运行时的应用监控 5.极大地提高了开发.部署效率 6.与云计算的天然集成 缺点: ...