最短路算法 —— 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 ...
随机推荐
- 第十六章:自定义push notification sound
前面一节已经讲过如何在ionic中集成jpush,这样我们的hybrid app在部署到ios或者android上面的时候,就可以接收通知了.如果不满足系统自带的声音,可以通过一些方式来播放自定义的通 ...
- xampp安装步骤及启动
1 chmod 755 xampp-linux-*-installer.run 2 sudo ./xampp-linux-*-installer.run 启动停止 3 sudo /opt/lampp ...
- C++ Memory System Part3 : 优化
前面的系列我们讲了自定义new和delete操作,其中针对deleteArray的问题还有需要优化的地方.我们这次就针对POD类型进行一次优化. 下面的代码是针对POD类型的模板函数实现,分别为New ...
- 8086中断系统——《x86汇编语言:从实模式到保护模式》读书笔记04
80X86中断系统 能够处理256个中断 用中断向量号0-255区别 可屏蔽中断还需要借助专用中断控制器Intel 8259A实现优先权管理 1.中断的分类 中断可以分为内部中断和外部中断. (1)内 ...
- flex buider 4.6 打开设计模式(designer)时提示内存不足错误的解决办法
先申明,此方法只适用于flex builder 4.6及以下版本, flex builder 4.7以后已经完全取消了designer功能,是没有办法补救的. 1. 首先下载APE文件,这个文件好像是 ...
- 使用openssl在命令行加密
对于需要在应用软件中进行加密编程的开发者,通过命令行把基本的加密操作做一遍是很有意义的.openssl支持在命令行进行各种基本加密算法的操作.这些操作过程无需编程,其命令参数与程序函数调用加密的参数有 ...
- 生成ks.cfg文件
RHEL 7下生成ks.cfg文件 环境 + RHEL 7 + 字符界面, 没有安装图形界面 软件包安装 + `yum install system-config-kickstart -y` + `y ...
- CF 303C——Minimum Modular——————【剪枝】
Minimum Modular time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- 深入理解JavaScript系列(34):设计模式之命令模式
介绍 命令模式(Command)的定义是:用于将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或者记录请求日志,以及执行可撤销的操作.也就是说改模式旨在将函数的调用.请求和 ...
- [转]Debugging into .NET Core源代码的两种方式
本文转自:http://www.cnblogs.com/maxzhang1985/p/6015719.html 阅读目录 一.前言 二.符号服务器 三.项目中添加ASP.NET Core源代码 四.写 ...