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. PyTorch 于 JupyterLab 的环境准备

    PyTorch 是目前主流的深度学习框架之一,而 JupyterLab 是基于 Web 的交互式笔记本环境.于 JupyterLab 我们可以边记笔记的同时.边执行 PyTorch 代码,便于自己学习 ...

  2. 关于BAPI_TRANSACTION_COMMIT一点说明

    我们调用bapi做了相关的业务操作后,通常都要在后面调用 BAPI_TRANSACTION_COMMIT来提交所做得更改 然而,有时候,在程序中需要调用多个不同的BAPI实现不同的功能,那么这个时候就 ...

  3. windows和linux修改ipv6和ipv4的优先级

    如果一台机器系统配置ipv6地址和ipv4地址共存,访问两种网站都可以 但有个很尴尬的问题,因为操作系统默认是V6优先于V4,所以比如一个地址同时有A和AAAA记录的话,那么系统会自动选择V6协议通信 ...

  4. Let’s Encrypt/Certbot移除/remove/revoke不需要的域名证书

    1.首先确认你的证书不再需要,如果有必要,请执行下面的命令进行备份 cp /etc/letsencrypt/ /etc/letsencrypt.backup -r 2.撤销证书然后删除证书 [root ...

  5. ELK (elasticsearch+kibana+logstash+elasticsearch-head) 华为云下载地址

    https://mirrors.huaweicloud.com/elasticsearch https://mirrors.huaweicloud.com/kibana https://mirrors ...

  6. 丢包 ICMP

    小结: 1.ICMP 常见网络丢包故障分析及处理 云极安 云极安 2019-12-25 我们在管理维护网络的过程中经常会遇到数据包丢失的现象.使用Ping命令进行连通性测试,则会发现Ping包延时远远 ...

  7. ctsc选课

    CTSC 1997 大学实行学分制.每门课程都有一定的学分,学生只要选修了这门课并通过考核就能获得相应学分.学生最后的学分是他选修各门课的学分总和. 每个学生都要选择规定数量的课程.有些课程可以直接选 ...

  8. codevs 1344 模拟退火

    1344 线型网络  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamo   题目描述 Description 有 N ( <=20 ) 台 PC 放在机房内 ...

  9. Linux——软件安装

    Linux--软件安装 一.gcc 二.make 三.rpm 四.yum 一.gcc gcc是Linux上面最标准的C语言的编译程序,用来源代码的编译链接. gcc -c hello.c 编译产生目标 ...

  10. 将Oracle数据,以及表结构如何传输至MySQL

    最近研究数据库,将Oracle数据库中的表结构以及数据传输给MySQL数据库,自己通过学习采用两种方式,效率较高. 方式一:Navicat 自从下载了Navicat,真的发现这是一款操作数据库十分优秀 ...