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的更多相关文章

  1. 图中最短路径算法(Dijkstra算法)(转)

    1.Dijkstra 1)      适用条件&范围: a)   单源最短路径(从源点s到其它所有顶点v); b)   有向图&无向图(无向图可以看作(u,v),(v,u)同属于边集E ...

  2. 最短路径算法(Dijkstra算法、Floyd-Warshall算法)

    最短路径算法具体的形式包括: 确定起点的最短路径问题:即已知起始结点,求最短路径的问题.适合使用Dijkstra算法. 确定终点的最短路径问题:即已知终结结点,求最短路径的问题.在无向图中,该问题与确 ...

  3. 数据结构与算法系列研究七——图、prim算法、dijkstra算法

    图.prim算法.dijkstra算法 1. 图的定义 图(Graph)可以简单表示为G=<V, E>,其中V称为顶点(vertex)集合,E称为边(edge)集合.图论中的图(graph ...

  4. 【最短路算法】Dijkstra+heap和SPFA的区别

    单源最短路问题(SSSP)常用的算法有Dijkstra,Bellman-Ford,这两个算法进行优化,就有了Dijkstra+heap.SPFA(Shortest Path Faster Algori ...

  5. 【算法】狄克斯特拉算法(Dijkstra’s algorithm)

    狄克斯特拉算法(Dijkstra’s algorithm) 找出最快的路径使用算法——狄克斯特拉算法(Dijkstra’s algorithm). 使用狄克斯特拉算法 步骤 (1) 找出最便宜的节点, ...

  6. 图论算法——最短路径Dijkstra,Floyd,Bellman Ford

    算法名称 适用范围 算法过程 Dijkstra 无负权 从s开始,选择尚未完成的点中,distance最小的点,对其所有边进行松弛:直到所有结点都已完成 Bellman-Ford 可用有负权 依次对所 ...

  7. 图论——迪杰斯特拉算法(Dijkstra)实现,leetcode

    迪杰斯特拉算法(Dijkstra):求一点到另外一点的最短距离 两种实现方法: 邻接矩阵,时间复杂度O(n^2) 邻接表+优先队列,时间复杂度O(mlogn)(适用于稀疏图) (n:图的节点数,m:图 ...

  8. 算法-迪杰斯特拉算法(dijkstra)-最短路径

    迪杰斯特拉算法(dijkstra)-最短路径 简介: 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中 ...

  9. 算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法

    一.名称 动态规划法应用 二.目的 1.贪婪技术的基本思想: 2.学会运用贪婪技术解决实际设计应用中碰到的问题. 三.要求 1.实现基于贪婪技术思想的Prim算法: 2.实现基于贪婪技术思想的Dijk ...

随机推荐

  1. Django-初阶实例

    调用本地css文件的方法 setting.py里面的内容 import os # Build paths inside the project like this: os.path.join(BASE ...

  2. Bitter.Core系列 十二 :Bitter ORM NETCORE ORM 全网最粗暴简单易用高性能的 NETCore 之 支持的 where 条件表达式

    Bitter.Core 内置了支持大部分的 linq 的条件表达式.基本上符合我们 where 条件所需.Bitter.Core 的支持 表达式内置  扩展 有: EndsWith    在Sql 解 ...

  3. hive搜索报错

    在自己搭建的集群上执行hive搜索语句 select count(*) from ods_event_log where dt='2019-12-14' group by dt; 报错如下: Stat ...

  4. Server Tracking of Client Session State Changes Connection Management

    MySQL :: MySQL 8.0 Reference Manual :: 5.1.12 Connection Management https://dev.mysql.com/doc/refman ...

  5. all header field names in both HTTP requests and HTTP responses are case-insensitive.

    https://tools.ietf.org/html/rfc6455#section-4.2.1 Please note that according to [RFC2616], all heade ...

  6. WebServices 与 Web API 的区别

    WebServices : WebServices 是可以通过 Internet 访问并通过 XML 编码规范其通信的任何服务. 客户通过发送请求(大部分是 XML消息)来召唤 WebServices ...

  7. luoguP2657 [SCOI2009] windy 数

    目录 luoguP2657 [SCOI2009] windy 数 简述题意: Solution: luoguP2657 [SCOI2009] windy 数 简述题意: 不含前导零且相邻两个数字之差至 ...

  8. cookie机制、session机制

    会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...

  9. 如何在windows下切换node版本

    安装nvm 最近的项目中,一个是用vue项目开发,一个是使用react开发,但是ant design pro使用了umi框架,所需要的node版本>10.0.0,vue那个项目中又不兼容node ...

  10. Java8中流的性能

    流(Stream)是Java8为了实现最佳性能而引入的一个全新的概念.在过去的几年中,随着硬件的持续发展,编程方式已经发生了巨大的改变,程序的性能也随着并行处理.实时.云和其他一些编程方法的出现而得到 ...