最短路算法 —— Dijkstra算法
用途:
解决单源最短路径问题(已固定一个起点,求它到其他所有点的最短路问题)
算法核心(广搜):
(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算法的更多相关文章
- 最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)(转)
一,问题描述 在英文单词表中,有一些单词非常相似,它们可以通过只变换一个字符而得到另一个单词.比如:hive-->five:wine-->line:line-->nine:nine- ...
- 最短路和次短路问题,dijkstra算法
/* *题目大意: *在一个有向图中,求从s到t两个点之间的最短路和比最短路长1的次短路的条数之和; * *算法思想: *用A*求第K短路,目测会超时,直接在dijkstra算法上求次短路; ...
- (转)最短路算法--Dijkstra算法
转自:http://blog.51cto.com/ahalei/1387799 上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短 ...
- 单源最短路:Dijkstra算法 及 关于负权的讨论
描述: 对于图(有向无向都适用),求某一点到其他任一点的最短路径(不能有负权边). 操作: 1. 初始化: 一个节点大小的数组dist[n] 源点的距离初始化为0,与源点直接相连的初始化为其权重,其他 ...
- HDOJ 2544 最短路(最短路径 dijkstra算法,SPFA邻接表实现,floyd算法)
最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- [Swust OJ 842]--实验室和食堂(最短路,Dijkstra算法)
题目链接:http://acm.swust.edu.cn/problem/842/ Time limit(ms): 1000 Memory limit(kb): 10000 Description ...
- 最短路-Prim算法 dijkstra算法
HDU-1233 #include <iostream> #define INF 1000000 using namespace std; ][]; ]; ]; ]; ]; int mai ...
- HDU1535——Invitation Cards(最短路径:SPAF算法+dijkstra算法)
Invitation Cards DescriptionIn the age of television, not many people attend theater performances. A ...
- 《算法导论》读书笔记之图论算法—Dijkstra 算法求最短路径
自从打ACM以来也算是用Dijkstra算法来求最短路径了好久,现在就写一篇博客来介绍一下这个算法吧 :) Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的 ...
- 最小生成树(prime算法 & kruskal算法)和 最短路径算法(floyd算法 & dijkstra算法)
一.主要内容: 介绍图论中两大经典问题:最小生成树问题以及最短路径问题,以及给出解决每个问题的两种不同算法. 其中最小生成树问题可参考以下题目: 题目1012:畅通工程 http://ac.jobdu ...
随机推荐
- vue之理解异步更新 --- nextTick
默认情况下,vue中DOM的更新是异步执行的,理解这一点非常重要. 当侦测到数据变化时,Vue会打开一个队列,然后把在同一个事件循环(event loop)当中观察到的数据变化的watcher推送进入 ...
- [Verilog] parameter
parameter和localparam的作用范围均为本模块,区别在于前者可用于在实例化模块的时候进行参数的传递. 用已定义的参数对变量赋值时,按照补码的方式处理,若出现溢出的情况,则截取低位.
- 省市区json数据
window.LocalList = [ { region:{ name:'北京市', code:'11', state:[ { name:'北京', code:'01', city:[ {name: ...
- bootstrap-table使用记录
效果如图所示: 1.框架用的flask 目录结构如下: 2.前端代码如下: table-test1.html <!DOCTYPE html> <html> <head&g ...
- JS常用的设计模式(2)——简单工厂模式
简单工厂模式是由一个方法来决定到底要创建哪个类的实例, 而这些实例经常都拥有相同的接口. 这种模式主要用在所实例化的类型在编译期并不能确定, 而是在执行期决定的情况. 说的通俗点,就像公司茶水间的饮料 ...
- c# 使用队列保存图片
Invoke(new EventHandler(delegate { Bitmap bitmap2 = (Bitmap)eventArgs.Frame.Clone(); ThreadPool.Queu ...
- 上传文件插件-bootstrap-fileinput
1. js文件: <link href="/bootstrap/css/fileinput.css" media="all" rel="styl ...
- jquery——write less,do more
rite less, do more.这句话想必是很多语言都提倡的. 在此举三个jquery的应用体现 一.绑定多个事件类型 $("div").bind("mouseov ...
- urllib模块的使用
Python3学习笔记(urllib模块的使用) 1.基本方法 urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, ca ...
- 正则表达式把所有Paul替换成Ringo:Paul Puala Pualine paul Paul
代码实现如下: <!DOCTYPE html><html><body> <h2>JavaScript Regular Expressions</h ...