维基说的很全面: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. 《DSP using MATLAB》Problem 7.33

    代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...

  2. python 搜索匹配文件目录下所有的jpg或者png图片

    import glob PATH_TO_TEST_IMAGES_DIR = 'D:\TrainChangeFifteenData\Picture\Test' for pidImage in glob. ...

  3. 2019-7-15-win10-uwp-在笔迹开始书写拿到书写移动事件

    title author date CreateTime categories win10 uwp 在笔迹开始书写拿到书写移动事件 lindexi 2019-7-15 8:58:5 +0800 201 ...

  4. LUOGU P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper

    题目描述 A little known fact about Bessie and friends is that they love stair climbing races. A better k ...

  5. htmlunit第一个爬虫演示 目标网址http://ent.sina.com.cn/film/

    基本都要放弃了 springmvc 配置了htmlunit之后无法运行,都不能正常实例化webclient,但是突然想起来用maven应用程序测试一下 结果竟然就可以了.好吧,还是有希望的 大佬博客 ...

  6. jnhs-SpringMVC的controller向jsp传递数据的五种方式

    参考此文http://blog.sina.com.cn/s/blog_6d3c1ec601014h1h.html 1 使用ModelAndVoew 引入:org.springframework.web ...

  7. 解决github下载慢的终极方法

    直接用ssr代理,使用全局代理. 下载墙外的软件,都可以,比如 GithubDsktop

  8. 删除 java代码中所有的注释

    删除 java代码中所有的注释.java public class CleanCommons { private static Pattern pattern = Pattern.compile(&q ...

  9. python 数据组合

  10. django中模型

    一.django需要使用数据库,则需要安装对应的驱动,比如mysql,则需要安装mysqlclient驱动: pip install mysqlclient 二.在settings.py文件中配置数据 ...