用途:

解决单源最短路径问题(已固定一个起点,求它到其他所有点的最短路问题)

算法核心(广搜):

(1)确定的与起点相邻的点的最短距离,再根据已确定最短距离的点更新其他与之相邻的点的最短距离。

(2)之后的更新不需要再关心最短距离已确定的点

三种实现模板:

一、矩阵朴素版

二、vector简单版

三、静态邻接表有点复杂版

 #include <iostream>
#include <algorithm>
#include <cstring>
#include <deque>
#include <cstdio>
#include <vector>
#include <queue>
#include <cmath>
#define INF 0x3f3f3f3f
using namespace std; //邻接矩阵 const int MAXN = ;
int dis[MAXN];
int e[MAXN][MAXN];
bool vis[MAXN];
int N, M; void dij()
{
int p, mis;
for(int i = ; i <= N; i++)
dis[i] = e[][i]; vis[] = true;
dis[] = ;
for(int i = ; i < N; i++)
{
mis = INF;
for(int j = ; j <= N; j++)
{
if(!vis[j] && dis[j] < mis)
{
mis = dis[j];
p = j;
}
}
vis[p] = true; for(int k = ; k <= N; k++)
{
if(dis[k] > dis[p] + e[p][k] && !vis[k])
dis[k] = dis[p] + e[p][k];
}
}
} void init()
{
for(int i = ; i <= N; i++)
for(int j = ; j <= N; j++)
if(i == j) e[i][j] = ;
else e[i][j] = INF;
memset(vis, false, sizeof(vis));
}
int main()
{
int a, b, c;
while(~scanf("%d%d", &N, &M))
{
if(N == && M == ) break;
init();
while(M--)
{
scanf("%d%d%d", &a, &b, &c);
e[a][b] = c;
e[b][a] = c;
} dij();
printf("%d\n", dis[N]);
} return ;
} //vector 动态邻接表 + 优先队列 const int MAXN = 1e3 + ;
struct edge
{
int to, cost;
edge(int vo = , int vt = ):
to(vo),cost(vt){}
}; vector<edge>G[MAXN];
typedef pair<int, int>P;
int dis[MAXN];
int N, M; void init()
{
for(int i = ; i <= N; i++)
{
G[i].clear();
dis[i] = INF;
} }
void Dijkstra(int s)
{
int u, v;
priority_queue<P, vector<P>, greater<P> > que;
que.push(P(, s));
dis[s] = ; while(!que.empty())
{
P p = que.top(); que.pop(); int u = p.second;
if(dis[u] < p.first) continue; for(int i = ; i < G[u].size(); i++)
{
edge v = G[u][i];
if(dis[v.to] > dis[u] + v.cost)
{
dis[v.to] = dis[u] + v.cost;
que.push(P(dis[v.to], v.to));
}
}
}
} int main()
{
int u, v, c;
scanf("%d%d", &N, &M);
init();
while(M--)
{
scanf("%d%d", &u, &v, &c);
G[u].push_back(edge(v, c));
//G[v].push(edge(u, c)); 建无向图
} //see see
/*
for(int i = 1; i <= N; i++)
{
for(int j = 0; j < G[i].size(); j++)
printf("%d ", G[i][j].to);
puts("");
}
*/ Dijkstra();
for(int i = ; i <= N; i++)
printf("%d ", dis[i]);
puts(""); return ;
} ///静态邻接表 + 优先队列优化 const int MAXN = 1e3 + ;
typedef pair<int, int> HeapNode;
struct edge
{
int v, nxt, w;
}G[MAXN*];
int head[MAXN], dis[MAXN];
int N, M, cnt; inline void init()
{
for(int i = ; i <= N; i++)
head[i] = -, dis[i] = INF;
cnt = ;
} inline void add(int from, int to, int we)
{
G[cnt].w = we;
G[cnt].v = to;
G[cnt].nxt = head[from];
head[from] = cnt++;
} void dij()
{
priority_queue<HeapNode, vector<HeapNode>, greater<HeapNode> > heap;
dis[] = ;
heap.push(make_pair(, ));
while(!heap.empty())
{
pair<int, int>T = heap.top();
heap.pop(); if(T.first != dis[T.second]) continue; for(int i = head[T.second]; i != -; i = G[i].nxt)
{
int v = G[i].v;
if(dis[v] > dis[T.second] + G[i].w)
{
dis[v] = dis[T.second] + G[i].w;
heap.push(make_pair(dis[v], v));
}
}
}
} int main()
{
int a, b, c;
while(~scanf("%d%d", &N, &M))
{
if(N == && M == ) break;
init();
while(M--)
{
scanf("%d%d%d", &a, &b, &c);
add(a, b, c);
add(b, a, c);
} dij();
printf("%d\n", dis[N]);
} return ;
}

最短路算法 —— Dijkstra算法的更多相关文章

  1. 最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)(转)

    一,问题描述 在英文单词表中,有一些单词非常相似,它们可以通过只变换一个字符而得到另一个单词.比如:hive-->five:wine-->line:line-->nine:nine- ...

  2. 最短路和次短路问题,dijkstra算法

    /*  *题目大意:  *在一个有向图中,求从s到t两个点之间的最短路和比最短路长1的次短路的条数之和;  *  *算法思想:  *用A*求第K短路,目测会超时,直接在dijkstra算法上求次短路; ...

  3. (转)最短路算法--Dijkstra算法

    转自:http://blog.51cto.com/ahalei/1387799         上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短 ...

  4. 单源最短路:Dijkstra算法 及 关于负权的讨论

    描述: 对于图(有向无向都适用),求某一点到其他任一点的最短路径(不能有负权边). 操作: 1. 初始化: 一个节点大小的数组dist[n] 源点的距离初始化为0,与源点直接相连的初始化为其权重,其他 ...

  5. HDOJ 2544 最短路(最短路径 dijkstra算法,SPFA邻接表实现,floyd算法)

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  6. [Swust OJ 842]--实验室和食堂(最短路,Dijkstra算法)

    题目链接:http://acm.swust.edu.cn/problem/842/ Time limit(ms): 1000 Memory limit(kb): 10000   Description ...

  7. 最短路-Prim算法 dijkstra算法

    HDU-1233 #include <iostream> #define INF 1000000 using namespace std; ][]; ]; ]; ]; ]; int mai ...

  8. HDU1535——Invitation Cards(最短路径:SPAF算法+dijkstra算法)

    Invitation Cards DescriptionIn the age of television, not many people attend theater performances. A ...

  9. 《算法导论》读书笔记之图论算法—Dijkstra 算法求最短路径

    自从打ACM以来也算是用Dijkstra算法来求最短路径了好久,现在就写一篇博客来介绍一下这个算法吧 :) Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的 ...

  10. 最小生成树(prime算法 & kruskal算法)和 最短路径算法(floyd算法 & dijkstra算法)

    一.主要内容: 介绍图论中两大经典问题:最小生成树问题以及最短路径问题,以及给出解决每个问题的两种不同算法. 其中最小生成树问题可参考以下题目: 题目1012:畅通工程 http://ac.jobdu ...

随机推荐

  1. 《The Python Standard Library》——http模块阅读笔记1

    官方文档:https://docs.python.org/3.5/library/http.html 偷个懒,截图如下: 即,http客户端编程一般用urllib.request库(主要用于“在这复杂 ...

  2. linux系统优化基础

    linux系统优化基础 tags: linux 优化 kingle---### 1, 查看centos版本:cat etc/redhat-release 看看centos架构信息:uname -m 查 ...

  3. 测试次数(C++)

    测试次数(结果填空) (满分17分) 注意事项:问题的描述在考生文件夹下对应题号的“题目.txt”中.相关的参考文件在同一目录中.请先阅读题目,不限解决问题的方式,只要求提交结果.必须通过浏览器提交答 ...

  4. git命令(转载学习)

    Git使用教程 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是 ...

  5. js判断触摸方向

    $("body").on("touchstart", function(e) { e.preventDefault(); startX = e.original ...

  6. [转]MVC+JQuery validate实现用户输入验证

    本文转自:http://www.cnblogs.com/ahui/archive/2010/10/08/1845677.html MVC服务器端: 1.在controller中验证用户输入,如果验证失 ...

  7. Jquery实现自动生成二级目录

    在博客园开通博客以后,就看到某位博友写的js自动生成目录的文章,当时觉得生成目录能给阅读带来方便,所以就直接拿来使用了.用了一段时间以后,发现只能生成一级目录,不能生成多级目录,有点美中不足.所以想着 ...

  8. Path类 操作文件类

    // Path类 IO命名空间 静态类 不能创建对象类名. string str =@"E:\C#程序设计基础入门教程\(第十一天)\122\22\nee.txt"; ////in ...

  9. linux安装lua_nginx_module模块

    ngx_lua_module 是一个nginx http模块,它把 lua 解析器内嵌到 nginx,用来解析并执行lua 语言编写的网页后台脚本,可以用来实现灰度发布.另外淘宝的OpenResty也 ...

  10. sql查询结果多对多转为一对多返回前端

    企业表 ent_EnterpriseArchives  有id,企业名称 entName veh_Vehicle 车辆表,有所属企业id  companyId,车辆id,车牌号licPlate 目的是 ...