维基说的很全面:https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm

理解:

  先设置访问数组vis[]和距离数组dist[],开始时把源点(source)先加入已访问数组(vis[source]=1),源点到源点的距离数组设为0(dist[source]=0);然后其它点到源点的dist[]为源点到该点的距离。然后找与源点相连的最近的点,并将其加入访问数组,再用这个点利用松弛操作更新其它未访问的点。循环执行顶点数-1次结束。

下面代码假设源点为1,终点为N。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = ;
int matrix[maxn][maxn];
int vis[maxn], dist[maxn];
int N, M; void Dijkstra(int source)
{
memset(vis, , sizeof(vis));
vis[source] = ;
for (int i = ; i <= N; i++) dist[i] = matrix[source][i]; int cost, k;
for (int i = ; i < N; i++)
{
cost = INF;
for (int j = ; j <= N; j++)
{
if (!vis[j] && dist[j]<cost)
{
cost = dist[j];
k = j;
}
} vis[k] = ; for (int j = ; j <= N; j++)
{
if (!vis[j] && matrix[k][j] != INF&&dist[j]>matrix[k][j] + cost)
{
dist[j] = matrix[k][j] + cost;
}
} }
} int main()
{
while (scanf("%d%d", &N, &M))
{
for (int i = ; i <= N; i++)
for (int j = ; j <= N; j++)
if (i == j) matrix[i][j] = ;
else matrix[i][j] = INF; for (int i = ; i<M; i++) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
matrix[u][v] = matrix[v][u] = w;
}
Dijkstra();
printf("%d\n", dist[N]);
}
return ;
}

用优先队列和vector:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=;
struct Node
{
int num,dis;//num存储当前节点的编号,dis存储路径长度
Node(){}
Node(int a,int b){num=a;dis=b;}
bool operator < (const Node& rhs)const{
dis>rhs.dis;
}
};
priority_queue<Node>que;
vector<vector<Node> >v;
int vis[maxn],dist[maxn];
int N,M; void Dijkstra(int s)
{
for (int i=;i<=N;i++) dist[i]=INF;
dist[s]=;
que.push(Node(s,dist[s]));
while(!que.empty())
{
Node p=que.top();que.pop();
for (int i=;i<v[p.num].size();i++)
{
Node q;
q.num=v[p.num][i].num;
if(dist[q.num]>dist[p.num]+v[p.num][i].dis)
{
dist[q.num]=dist[p.num]+v[p.num][i].dis;
que.push(Node(q.num,dist[q.num]));
}
}
}
} int main()
{
scanf("%d%d",&N,&M);
v.clear();
v.resize(N+);
for (int i=;i<M;i++)
{
int fr,to,w;
scanf("%d%d%d",&fr,&to,&w);
v[fr].push_back(Node(to,w));
v[to].push_back(Node(fr,w)); }
Dijkstra();
printf("%d\n",dist[N]);
}

hdu1874畅通工程续为例,一个pair较为偷懒的写法:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn = ;
vector<pair<int, int> > E[maxn];
int d[maxn];
int n, m; void Dijkstra(int s)
{
priority_queue<pair<int, int> >Q;
d[s] = ;
Q.push(make_pair(-d[s],s));
while (!Q.empty())
{
int now = Q.top().second; Q.pop();
for (int i = ; i < E[now].size(); i++)
{
int v = E[now][i].first;
if (d[v] > d[now] + E[now][i].second)
{
d[v] = d[now] + E[now][i].second;
Q.push(make_pair(-d[v], v));
}
}
}
} int main()
{
while (scanf("%d%d",&n,&m)==)
{
for (int i = ; i < n; i++) E[i].clear();
for (int i = ; i < n; i++) d[i] = 1e9;
for (int i = ; i < m; i++)
{
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
E[x].push_back(make_pair(y,z));
E[y].push_back(make_pair(x, z));
}
int s, t;
scanf("%d%d", &s, &t);
Dijkstra(s);
if (d[t] == 1e9)
printf("-1\n");
else
printf("%d\n", d[t]);
}
return ;
}

最短路-Dijkstra算法整理的更多相关文章

  1. 单源最短路dijkstra算法&&优化史

    一下午都在学最短路dijkstra算法,总算是优化到了我能达到的水平的最快水准,然后列举一下我的优化历史,顺便总结总结 最朴素算法: 邻接矩阵存边+贪心||dp思想,几乎纯暴力,luoguTLE+ML ...

  2. 最短路Dijkstra算法的一些扩展问题

    最短路Dijkstra算法的一些扩展问题     很早以前写过关于A*求k短路的文章,那时候还不明白为什么还可以把所有点重复的放入堆中,只知道那样求出来的就是对的.知其然不知其所以然是件容易引发伤痛的 ...

  3. ACM: HDU 2544 最短路-Dijkstra算法

    HDU 2544最短路 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Descrip ...

  4. 单源最短路Dijkstra算法——matlab实现

    迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想 通过Dijk ...

  5. hdu2544 最短路 Dijkstra算法

    最短路(Dijkstra算法模板题) Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  6. 单源最短路(Dijkstra算法)

    #返回上一级 @Author: 张海拔 @Update: 2015-03-11 @Link: http://www.cnblogs.com/zhanghaiba/p/3514570.html Dijk ...

  7. 单源最短路——dijkstra算法

    Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 问 ...

  8. POJ 3268 Silver Cow Party 最短路—dijkstra算法的优化。

    POJ 3268 Silver Cow Party Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbe ...

  9. POJ-3268-最短路(dijkstra算法)

    Silver Cow Party Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12494   Accepted: 5568 ...

随机推荐

  1. java 遍历

    LinkedList倒序遍历 public List<Integer> getNewsFeed(int userId) { List<Integer> res = new Ar ...

  2. 1.关于Spring Cloud的一些基本知识

    GA代表 general avaliable 通用可用版  也就是 正式发行版 PRE 代表预版本  就是还没有成熟 SNAPSHOT 快照版 这个版本可用 没有bug但是后期还会改进 选了这个spr ...

  3. Effective Modern C++ 条款4:掌握查看型别推导结果的方法

    采用何种工具来查看型别推导结果,取决于你在软件开发过程的哪个阶段需要该信息.主要研究三个可能的阶段:撰写代码阶段.编译阶段.运行时阶段. IDE编译器 IDE中的代码编译器通常会在你将鼠标指针选停止某 ...

  4. Gym - 102082G

    Gym - 102082Ghttps://vjudge.net/problem/2198225/origin对于数列中任意一个数,要么从最左边到它不递减,要么从最右边到到它不递减,为了满足这个条件,就 ...

  5. php5.3中namespace的说明,帮助初次接触namespace的phper快速理解

    命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只要避免命名重复就可以解决,最常见的一种做法是约定一个前缀,但是方法名变的很长 ...

  6. vmware三种网络模式配置(转载)

    虚拟机系统安装的是Linux系统 首先,在本机上查看所有网络配置连接,使用命令:ipconfig Microsoft Windows [版本 6.1.7600]版权所有 (c) 2009 Micros ...

  7. Java review-basic6

    1. Weak references: In computer programming, a weak reference is a reference that does not protect t ...

  8. mysql查询某个字段并修改

    比如我存储的数据,有的是 山东,有的是山东省 我想统一改为山东省 UPDATE t_security SET province = REPLACE( province, '山东', '山东省' ) W ...

  9. 超高频率问题之信息: Illegal access: this web application instance has been stopped already. Could not load . The eventual following stack trace is caused by an error thrown for debugging purposes as well as

    出现频率非常高,目前还不确定具体是什么原因导致

  10. vue项目及插件

    vue项目的创建 方法1: cmd中执行 vue ui vue会创建一个socket,方便快捷 方法2: 命令行建立 vue create v-proj //创建项目名为v-proj的项目文件 > ...