时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

万圣节的晚上,小Hi和小Ho在吃过晚饭之后,来到了一个巨大的鬼屋!

鬼屋中一共有N个地点,分别编号为1..N,这N个地点之间互相有一些道路连通,两个地点之间可能有多条道路连通,但是并不存在一条两端都是同一个地点的道路。

不过这个鬼屋虽然很大,但是其中的道路并不算多,所以小Hi还是希望能够知道从入口到出口的最短距离是多少?

提示:Super Programming Festival Algorithm。

输入

每个测试点(输入文件)有且仅有一组测试数据。

在一组测试数据中:

第1行为4个整数N、M、S、T,分别表示鬼屋中地点的个数和道路的条数,入口(也是一个地点)的编号,出口(同样也是一个地点)的编号。

接下来的M行,每行描述一条道路:其中的第i行为三个整数u_i, v_i, length_i,表明在编号为u_i的地点和编号为v_i的地点之间有一条长度为length_i的道路。

对于100%的数据,满足N<=10^5,M<=10^6, 1 <= length_i <= 10^3, 1 <= S, T <= N, 且S不等于T。

对于100%的数据,满足小Hi和小Ho总是有办法从入口通过地图上标注出来的道路到达出口。

输出

对于每组测试数据,输出一个整数Ans,表示那么小Hi和小Ho为了走出鬼屋至少要走的路程。

样例输入
5 10 3 5
1 2 997
2 3 505
3 4 118
4 5 54
3 5 480
3 4 796
5 2 794
2 5 146
5 4 604
2 5 63
样例输出
172
 #include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <climits>
using namespace std; const int INF = 1e9; struct node {
int idx;
int len;
node(int _idx = , int _len = ) : idx(_idx), len(_len){}
}; int N, M, S, T;
vector<vector<node>> graph;
vector<int> dist; void solve() {
vector<int> visit(N+, false);
//priority_queue<int, vector<int>, greater<int>> heap;
queue<int> heap;
dist[S] = ;
heap.push(S);
visit[S] = true;
while (!heap.empty()) {
//int u = heap.top();
int u = heap.front();
heap.pop();
visit[u] = false;
for (int i = ; i < graph[u].size(); ++i) {
int v = graph[u][i].idx;
if (dist[v] > dist[u] + graph[u][i].len) {
dist[v] = dist[u] + graph[u][i].len;
if (!visit[v]) {
heap.push(v);
visit[v] = true;
}
}
}
}
cout << dist[T] << endl;
} int main() {
while (cin >> N >> M >> S >> T) {
graph.assign(N+, vector<node>());
dist.assign(N+, INF);
int u, v, len;
for (int i = ; i <= M; ++i) {
cin >> u >> v >> len;
graph[u].push_back(node(v, len));
graph[v].push_back(node(u, len));
}
solve();
}
return ;
}

堆优化的Dijkstra算法。总体来说还是SPFA算法更好写一点。不过Dijsktra算法可以提前输出,只到轮到点T,直接输出即可。

 #include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std; const int INF = 1e9; struct edge {
int idx;
int dist;
edge(int _idx, int _dist) : idx(_idx), dist(_dist) {}
}; struct cmp {
bool operator () (const edge &a, const edge &b) { return a.dist > b.dist; }
}; int N, M, S, T;
vector<vector<edge>> graph; void solve() {
priority_queue<edge, vector<edge>, cmp> heap;
vector<int> dist(N + , INF);
vector<bool> visit(N + , false);
dist[S] = ;
visit[S] = true;
for (int i = ; i < graph[S].size(); ++i) {
auto v = graph[S][i];
dist[v.idx] = min(dist[v.idx], v.dist);
heap.push(edge(v.idx, dist[v.idx]));
}
while (!heap.empty()) {
auto u = heap.top();
heap.pop();
if (u.idx == T) {
cout << u.dist << endl;
return;
}
if (visit[u.idx]) continue;
visit[u.idx] = true;
for (int i = ; i < graph[u.idx].size(); ++i) {
auto v = graph[u.idx][i];
if (!visit[v.idx] && dist[v.idx] > dist[u.idx] + v.dist) {
dist[v.idx] = dist[u.idx] + v.dist;
heap.push(edge(v.idx, dist[v.idx]));
}
}
}
cout << "-1" << endl;
} int main() {
while (cin >> N >> M >> S >> T) {
int u, v, len;
graph.resize(N + );
for (int i = ; i < M; ++i) {
cin >> u >> v >> len;
graph[u].push_back(edge(v, len));
graph[v].push_back(edge(u, len));
}
solve();
}
return ;
}

[hihoCoder] #1093 : 最短路径·三:SPFA算法的更多相关文章

  1. 【最短路径】 SPFA算法

    上一期介绍到了SPFA算法,只是一笔带过,这一期让我们详细的介绍一下SPFA. 1 SPFA原理介绍 SPFA算法和dijkstra算法特别像,总感觉自己讲的不行,同学说我的博客很辣鸡,推荐一个视频讲 ...

  2. 【最短路径】 SPFA算法优化

    首先先明确一个问题,SPFA是什么?(不会看什么看,一边学去,传送门),SPFA是bellman-ford的队列优化版本,只有在国内才流行SPFA这个名字,大多数人就只知道SPFA就是一个顶尖的高效算 ...

  3. 【最短路径】 常用算法图解+1376:信使(msner)六解

    进入图之后,最短路径可谓就是一大重点,最短路径的求法有很多种,每种算法各有各的好处,你会几种呢?下面来逐个讲解. 1 floyed算法 1)明确思想及功效:在图中求最短路还是要分开说的,分别是单源最短 ...

  4. hihocoder 1093 SPFA算法

    题目链接:http://hihocoder.com/problemset/problem/1093 , 最短路的SPFA算法. 由于点的限制(10w),只能用邻接表.今天也学了一种邻接表的写法,感觉挺 ...

  5. 最短路径--SPFA 算法

    适用范围:给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了. 我们约定有向加权图G不存在负权回路,即最短路径一 ...

  6. Bellman-Ford & SPFA 算法——求解单源点最短路径问题

    Bellman-Ford算法与另一个非常著名的Dijkstra算法一样,用于求解单源点最短路径问题.Bellman-ford算法除了可求解边权均非负的问题外,还可以解决存在负权边的问题(意义是什么,好 ...

  7. 最短路径——SPFA算法

    一.前提引入 我们学过了Bellman-Ford算法,现在又要提出这个SPFA算法,为什么呢? 考虑一个随机图(点和边随机生成),除了已确定最短路的顶点与尚未确定最短路的顶点之间的边,其它的边所做的都 ...

  8. 图的最短路径-----------SPFA算法详解(TjuOj2831_Wormholes)

    这次整理了一下SPFA算法,首先相比Dijkstra算法,SPFA可以处理带有负权变的图.(个人认为原因是SPFA在进行松弛操作时可以对某一条边重复进行松弛,如果存在负权边,在多次松弛某边时可以更新该 ...

  9. 最短路径——Bellman-Ford算法以及SPFA算法

    说完dijkstra算法,有提到过朴素dij算法无法处理负权边的情况,这里就需要用到Bellman-Ford算法,抛弃贪心的想法,牺牲时间的基础上,换取负权有向图的处理正确. 单源最短路径 Bellm ...

随机推荐

  1. [Node.js]30. Level 6: Listen 'Question' from client, and then Answer the Question

    Clients can also answer each other questions, so let's build that feature by first listening for the ...

  2. Android开发之对话框高级应用

    Android开发之对话框高级应用 创建并显示一个对话框非常easy.可是假设想进行一些更高级点的操作,就须要一些技巧了.以下将和大家分享一下对话框使用的一些高级技巧. 1.改变对话框的显示位置: 大 ...

  3. ubuntu环境下android开发环境安装

    http://blog.csdn.net/shulianghan/article/details/38023959 Android程序开发的环境配置 Ubuntu下自带openjdk的卸载 你无需管它 ...

  4. UITableViewCell 取消选中的蓝色背景

    方案一: [self.tableView setAllowsSelection:NO]; 方案二: [cell setSelectionStyle:UITableViewCellSelectionSt ...

  5. 输出python的help结果到文件中

    1.命令行方式: python -c "import sys; help(sys.exit)" > help.txt 2.函数代码的方式输出 def help_output( ...

  6. MySQL双主如何解决主键冲突问题

    搭建了个双主,突然想到如果表设置了自增主键的话,当业务同时向双库中插入一条数据,这时候情况是什么样子的呢? 比如:主库A和主库B上的一个表数据为: 12 'ninhao' .当业务同时写入数据后主库A ...

  7. MySQL主从常见的架构

    Master-Slave  级联  双Master互为主备

  8. JDK1.7的一些新特性

    整理了几条对开发可能用到概率高的 1.swicth支持对String的判断:(以前只能支持Int及以下的) switch (s) { case "1": break; case & ...

  9. css3中-moz、-ms、-webkit 是什么意思

    -moz代表firefox浏览器私有属性-ms代表IE浏览器私有属性-webkit代表chrome.safari私有属性 私有属性例如:设置div圆角的大小 -webkit-border-radius ...

  10. jQuery 源码学习笔记

    //检测 window 中新增的对象 //first var oldMap = {}; for(var i in window) { oldMap[i] = 1; } //second for(var ...