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. 命名秘籍周获近五千星——GitHub 热点速览 v.21.04

    作者:HelloGitHub-小鱼干 命名一直是编程界的难点,这次 naming-cheatsheet 就能帮上你的忙.按照它的 SID(Short..Intuitive.Descriptive)原则 ...

  2. 浅析Redis与IO多路复用器原理

    为什么Redis使用多路复用I/O Redis 是跑在单线程中的,所有的操作都是按照顺序线性执行的,但是由于读写操作等待用户输入或输出都是阻塞的,所以 I/O 操作在一般情况下往往不能直接返回,这会导 ...

  3. Bitter.Core系列二:Bitter ORM NETCORE ORM 全网最粗暴简单易用高性能的 NETCore ORM 之数据库连接

    Bitter.Core NETCore 相当的简单易用,下面附上使用示例: 数据中连接:请在你的NETCORE 项目中 创建:Bitter.json 配置文件,然后追加如下配置内容: MSSQL 连接 ...

  4. (转载)微软数据挖掘算法:Microsoft 神经网络分析算法(10)

    前言 有段时间没有进行我们的微软数据挖掘算法系列了,最近手头有点忙,鉴于上一篇的神经网络分析算法原理篇后,本篇将是一个实操篇,当然前面我们总结了其它的微软一系列算法,为了方便大家阅读,我特地整理了一篇 ...

  5. 类型检查和鸭子类型 Duck typing in computer programming is an application of the duck test 鸭子测试 鸭子类型 指示编译器将类的类型检查安排在运行时而不是编译时 type checking can be specified to occur at run time rather than compile time.

    Go所提供的面向对象功能十分简洁,但却兼具了类型检查和鸭子类型两者的有点,这是何等优秀的设计啊! Duck typing in computer programming is an applicati ...

  6. 【转载】【网络安全】渗透中 PoC、Exp、Payload 与 Shellcode 的区别

    原文地址 渗透中 PoC.Exp.Payload 与 Shellcode 的区别 概念 PoC,全称"Proof of Concept",中文"概念验证",常指 ...

  7. MonkeyScript

    MonkeyScript的简单使用 一. 什么是MonkeyScript MS 是官方提供的,除了像猴子一样随机乱点之外,还可以通过编写脚本的形式,完成一系列固定的操作.MS 提供一整套完善的 API ...

  8. 本地MarkDown优雅发表

    本地MarkDown优雅发表 前言 身为一名程序员,记录笔记.发表博客首选便是MarkDown,现在网上有好多发表博客的地方:CSDN.博客园.简书,甚至一些大佬都有自己专属博客,但自己最喜欢的还是博 ...

  9. 不会开发的你也能管理好企业漏洞,开源免费工具:洞察(insight II)

    前言 公司刚开始建设安全管理时,都是从一片混沌开始的,资源总是不够的,我们每个做安全的人员,又要会渗透,又要抓制度,还得管理各种漏洞.在管理楼栋是,我相信大家都遇到过以下几个问题: 漏洞提交太多,自己 ...

  10. 小程序UnionID浅谈

    UnionID机制说明 如果开发者拥有多个移动应用.网站应用.和公众帐号(包括小程序),可通过 UnionID 来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用.网站应用和公众帐号(包 ...