初学算法之dijkstra
dijkstra的代码思想网上各路高手所述备矣。这里只是存下用邻接矩阵和邻接表实现的dijkstra。(白书代码)
邻接矩阵
1 void dijkstra(int s){
2 int dis[s]=0;
3 while(1){
4 int v=0; //从尚未使用过的顶点中选择一个距离最小的顶点
5 for(int u=1;u<=n;u++){
6 if(!used[u]&&dis[v]>dis[u])
7 v=u;
8 }
9 if(!v) break;
10 used[v]=1;
11 for(int u=1;u<=n;u++){
12 dis[u]=min(dis[u],dis[v]+dis[v][u]);
13 }
14 }
15 }
堆优化的dijkstra
1 struct edge{int to,cost;};
2 typedef pair<int ,int > P;
3
4 int V;
5 vector<int>G[Max];
6 int d[Max];
7
8 void dijkstra(int s){
9 priority_queue<P>,vector<P>,greater<P> >que;//通过指定greater<P>参数
10 que.push(P(0,s)); //堆按照first从小到大的顺序取出值
11
12 while(!que.empty()){
13 P p=que.top();que.pop();
14 int v=p.second;
15 if(d[v]<p.first) continue;
16 for(int i=0;i<G[v].size();i++){
17 edge e=G[v][i];
18 if(d[e.to]>d[v]+e.cost){
19 d[e.to]=d[v]+e.cost;
20 que.push(P(d[e.to],e.to));
21 }
22 }
23 }
24 }
25
26
例题:hdu-2544 最短路
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?
Input输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
输入保证至少存在1条商店到赛场的路线。
Output对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间Sample Input
2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0
Sample Output
3
2
这题就是单纯的套模板
附本人堆优化dijkstra的ac代码
1 #include <cstdio>
2 #include <cstring>
3 #include <queue>
4 #include <vector>
5 const int Max = 111111;
6 const int inf = 0x3f3f3f3f;
7 using namespace std;
8 struct edge{int to,cost;};
9 vector<edge>G[Max];
10 int d[Max];
11 typedef pair<int,int>P;
12 void dijkstra(){
13 priority_queue<P,vector<P>,greater<P> >que;
14 d[0]=0;
15 que.push(P(0,0));
16 while(!que.empty()){
17 P p=que.top();que.pop();
18 // printf("%d ",p.first);
19 int v=p.second;
20 if(d[v]<p.first) continue;
21 for(int i=0;i<G[v].size();i++){
22 edge e=G[v][i];
23 if(d[e.to]>d[v]+e.cost){
24 // printf("%d ",d[e.to]);
25 d[e.to]=d[v]+e.cost;
26 que.push(P(d[e.to],e.to));
27 }
28 }
29 }
30 }
31 int main(){
32 int n,m;
33 while(~scanf("%d %d",&n,&m),n+m){
34 memset(d,inf,sizeof(d));
35 int a,b,c;
36 for(int i=0;i<m;i++){
37 scanf("%d %d %d",&a,&b,&c);
38 a-=1;
39 b-=1;
40 edge e;
41 e.to=b;e.cost=c;
42 G[a].push_back(e);
43 e.to=a;
44 G[b].push_back(e);
45 }
46 dijkstra();
47 printf("%d\n",d[n-1]);
48 for(int i=0;i<m;i++)
49 G[i].clear();
50 }
51 return 0;
52 }
附本人邻接矩阵的ac代码
1 #include<cstdio>
2 #include<cstring>
3 #include<vector>
4 #include<algorithm>
5 #include<iostream>
6 #include<queue>
7
8 using namespace std;
9
10 const int inf = 0x3f3f3f3f;
11
12 int mp[105][105],dis[105],used[105],n;
13
14 void dijkstra(){
15 for(int i=1;i<=n;i++){
16 dis[i]=mp[1][i];
17 }
18 // for(int i=1;i<=n;i++)
19 // cout << mp[1][i] <<endl;
20 dis[1]=0;
21 used[1]=1;
22 while(1){
23 int minn=inf,u=-1;
24 for(int i=1;i<=n;i++){
25 if(minn>dis[i]&&used[i]==0){
26 minn=dis[i];
27 u=i;
28 }
29 }
30 used[u]=1;
31 if(u==-1) break;
32 for(int i=1;i<=n;i++){
33 int temp=min(inf,dis[u]+mp[u][i]);
34 if(dis[i]>temp){
35 dis[i]=temp;
36 }
37 }
38 }
39 }
40 int main(){
41 ios::sync_with_stdio(false);
42 int m,i,j,a,b,c;
43 while(cin >> n >> m,n||m){
44 memset(dis,0,sizeof(dis));
45 memset(mp,inf,sizeof(mp));
46 memset(used,0,sizeof(used));
47 for(i=0;i<m;i++){
48 cin >> a >> b >> c;
49 mp[a][b] = c;
50 mp[b][a] = c;
51 }
52 dijkstra();
53
54 cout << dis[n] << endl;
55 }
56 return 0;
57 }
初学算法之dijkstra的更多相关文章
- 图中最短路径算法(Dijkstra算法)(转)
1.Dijkstra 1) 适用条件&范围: a) 单源最短路径(从源点s到其它所有顶点v); b) 有向图&无向图(无向图可以看作(u,v),(v,u)同属于边集E ...
- 最短路径算法(Dijkstra算法、Floyd-Warshall算法)
最短路径算法具体的形式包括: 确定起点的最短路径问题:即已知起始结点,求最短路径的问题.适合使用Dijkstra算法. 确定终点的最短路径问题:即已知终结结点,求最短路径的问题.在无向图中,该问题与确 ...
- 数据结构与算法系列研究七——图、prim算法、dijkstra算法
图.prim算法.dijkstra算法 1. 图的定义 图(Graph)可以简单表示为G=<V, E>,其中V称为顶点(vertex)集合,E称为边(edge)集合.图论中的图(graph ...
- 【最短路算法】Dijkstra+heap和SPFA的区别
单源最短路问题(SSSP)常用的算法有Dijkstra,Bellman-Ford,这两个算法进行优化,就有了Dijkstra+heap.SPFA(Shortest Path Faster Algori ...
- 【算法】狄克斯特拉算法(Dijkstra’s algorithm)
狄克斯特拉算法(Dijkstra’s algorithm) 找出最快的路径使用算法——狄克斯特拉算法(Dijkstra’s algorithm). 使用狄克斯特拉算法 步骤 (1) 找出最便宜的节点, ...
- 图论算法——最短路径Dijkstra,Floyd,Bellman Ford
算法名称 适用范围 算法过程 Dijkstra 无负权 从s开始,选择尚未完成的点中,distance最小的点,对其所有边进行松弛:直到所有结点都已完成 Bellman-Ford 可用有负权 依次对所 ...
- 图论——迪杰斯特拉算法(Dijkstra)实现,leetcode
迪杰斯特拉算法(Dijkstra):求一点到另外一点的最短距离 两种实现方法: 邻接矩阵,时间复杂度O(n^2) 邻接表+优先队列,时间复杂度O(mlogn)(适用于稀疏图) (n:图的节点数,m:图 ...
- 算法-迪杰斯特拉算法(dijkstra)-最短路径
迪杰斯特拉算法(dijkstra)-最短路径 简介: 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中 ...
- 算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
一.名称 动态规划法应用 二.目的 1.贪婪技术的基本思想: 2.学会运用贪婪技术解决实际设计应用中碰到的问题. 三.要求 1.实现基于贪婪技术思想的Prim算法: 2.实现基于贪婪技术思想的Dijk ...
随机推荐
- css全站变灰
2020年4月4日全国哀悼日这一天,我发现不少网址都变灰了,我第一想法就是怎么做到的?不可能换素材整个网址重做一遍吧?后面发现是用的其实是css的filter滤镜: grayscale可以将图像转化为 ...
- DOCKER 安装步骤-最靠谱的笔记
一.系统环境规划 服务器名 项目名称 docker 操作系统 CentOS Linux release 7.1.1503 (Core) Docker 版本 17.03.2-ce 二.Docker ...
- Ubuntu创建桌面图标
以火狐为例 创建"~/.local/share/applications/firefox_dev.desktop"文件, 文件内容为: [Desktop Entry] Name=F ...
- Spider爬虫基础
get获取某个网站的html代码,post访问网站获取网站返回的信息 import urllib.request import urllib.parse #使用get请求 def start1(): ...
- ORM动态表达式树查询
前言 接口获取参数后,创建返回值模型的条件表达式作为参数,传入使用依赖注入实例化后的业务层. 业务层创建返回值模型的IQUERY后,再使用参数条件表达式.最后进行延迟查询. 代码实现 参数模型Demo ...
- Bitter ORM NETCORE ORM 全网最粗暴简单易用高性能的 NETCore ORM 开源了
开源的来了,懒人程序员的福音,.NET 生态闭环太缺开源精神了, 拥抱开源! 前言: 本人不是不喜欢现有ORM的轮子,而是发现现有的ORM 的都不太符合开发人员的一些习惯.现有的ORM 要么功能太冗余 ...
- elasticsearch从开始到永久
0.学习目标 独立安装Elasticsearch 会使用Rest的API操作索引 会使用Rest的API查询数据 会使用Rest的API聚合数据 掌握Spring Data Elasticsearch ...
- 淘宝APP消息推送模型
为什么到了2020年,"统一推送联盟"依旧无法起显著作用? - 知乎 https://www.zhihu.com/question/370632447 https://mp.wei ...
- 正向代理 forward proxy、反向代理 reverse proxy、透明代理 transparent proxy
https://zh.wikipedia.org/wiki/反向代理 反向代理在计算机网络中是代理服务器的一种.服务器根据客户端的请求,从其关系的一组或多组后端服务器(如Web服务器)上获取资源,然后 ...
- (转载)微软数据挖掘算法:Microsoft 决策树分析算法(1)
微软数据挖掘算法:Microsoft 目录篇 介绍: Microsoft 决策树算法是分类和回归算法,用于对离散和连续属性进行预测性建模. 对于离散属性,该算法根据数据集中输入列之间的关系进行预测. ...