最短路算法 —— 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 ...
随机推荐
- oracle 基础知识(八)----Library Cache *
一,介绍 Library cache是Shared pool的一部分,它几乎是Oracle内存结构中最复杂的一部分,主要存放shared curosr(SQL)和PLSQL对象(function,pr ...
- 4GLTE@NB-IOT
参考:https://www.cnblogs.com/pangguoming/p/9755916.html NB-IOT特点:在4G基础上发展而来,覆盖广,海量接入,成本低低功耗:不适合应用情况:大数 ...
- HTML问题 | 两个Input在同一行连着不留缝隙
方法1:让两个 input 连在一起写 不换行 <div class="inputDiv"> <input type="text" place ...
- 【python数据分析】利用Anaconda在window上搭建数据分析环境
由于在进行数据分析过程中,需要安装一些第三方库,导致python总会报一些错误,现将通过利用Anaconda搭建数据分析环境,已测可用. 1.到官网上下载python:https://www.pyth ...
- QQ会员2018春节红包抵扣券项目背后的故事
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 1. 活动数据 截止3月1日手Q运动红包会员礼包发放核销数据 参与红包活动用户数:2亿+ 发券峰值:52w/min 2. 需求背景 2.1 ...
- 深入理解JavaScript系列(17):面向对象编程之概论
介绍 在本篇文章,我们考虑在ECMAScript中的面向对象编程的各个方面(虽然以前在许多文章中已经讨论过这个话题).我们将更多地从理论方面看这些问题. 特别是,我们会考虑对象的创建算法,对象(包括基 ...
- 信鸽推送 C#版SDK
信鸽官方sdk没提供C#版的DEMO,考虑到应该有其他.NET的也会用到信鸽,下面是我在使用信鸽过程中写的demo.有什么不对的地方,欢迎各位大牛指导. 使用过程中主要是有2个问题: 1.参数组装,本 ...
- ThinkPHP3.2 整合支付宝RSA加密方式
RSA核心加密验证算法 <?php /** * RSA签名 * @param $data 待签名数据 * @param $private_key 商户私钥字符串 * return 签名结果 */ ...
- 在windows上用netsh动态配置端口转发
使用多个虚拟机,将开发环境和工作沟通环境分开(即时通,办公系统都只能在windows下使用…),将开发环境的服务提供给外部访问时,需要在主机上通过代理配置数据转发. VirtualBox提供了端口转发 ...
- Java基础之 学java从宝宝的命令行做起
JAVA学习笔记 JAVA命令行 在当前文件的命令行下 编译:输入命令javac GetGreeting.java 执行 命令 Java GetGreeting 有package包的程序 1.到文件当 ...