维基说的很全面: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. 从登录接口的响应结果里提取token

    token一般存在于2个地方:1. cookie, 2 ,某个接口的响应结果中 1. 我们接口的token存在于登录接口的响应结果中,如下图: token值 为红色标记的值,在登录接口里加以下2行代码 ...

  2. JavaWeb — Servlet(Server Applet)

    Servlet(Server Applet) 全称Java Servlet,未有中文译文.是用Java编写的服务器端程序.其主要功能在于交互式地浏览和修改数据,生成动态Web内容. 狭义的Servle ...

  3. 查看cpu性能和磁盘空间

    df -h查看当前磁盘空间 du -sh查看当前目录占用的磁盘空间 du -sh * 查看当前所有目录占用的磁盘空间   lscpu查看cpu信息 free查看空间总量

  4. https://vjudge.net/problem/2198220/origin

    https://vjudge.net/problem/2198220/origin枚举等差数列第一个和第二个,然后二分确定数列后面是否存在,复杂度比较玄学,卡过了. #include<iostr ...

  5. 基于MaxCompute的媒体大数据开放平台建设

    摘要:随着自媒体的发展,传统媒体面临着巨大的压力和挑战,新华智云运用大数据和人工智能技术,致力于为媒体行业赋能.通过媒体大数据开放平台,将媒体行业全网数据汇总起来,借助平台数据处理能力和算法能力,将有 ...

  6. [Array]217.Contains Duplicate

    Given an array of integers, find if the array contains any duplicates. Your function should return t ...

  7. Winform 分页

    1.图列展示 2.分页控件代码 Paging.Designer.cs partial class Paging { /// <summary> /// 必需的设计器变量. /// < ...

  8. 使用SpringBoot发送mail邮件

    1.前言 发送邮件应该是网站的必备拓展功能之一,注册验证,忘记密码或者是给用户发送营销信息.正常我们会用JavaMail相关api来写发送邮件的相关代码,但现在springboot提供了一套更简易使用 ...

  9. Nginx 日志切割后无法记日志

    日志切割会向Nginx Pid发送一个信号重新打开日志文件,如果nginx.conf没有配置PID,切割日志后找不到PID文件,就会出问题

  10. 洛谷P1474 [USACO 2.3]货币系统 Money Systems [2017年4月计划 动态规划04]

    P1474 货币系统 Money Systems 题目描述 母牛们不但创建了它们自己的政府而且选择了建立了自己的货币系统.由于它们特殊的思考方式,它们对货币的数值感到好奇. 传统地,一个货币系统是由1 ...