最短路径——SPFA算法
2015-10-08 19:21
302 查看
最短路径的快速算法
#1093 : 最短路径·三:SPFA算法
时间限制: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
AC代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<deque>
#include<list>
#include<iterator>
using namespace std;
#define MAX 1000
#define INF 0x7fffffff
struct edge {
int to, weight;
};
struct Map {
vector<edge> adjmap[MAX];
bool in_queue[MAX];
int in_sum[MAX];
int dist[MAX];
int path[MAX];
int nodesum;
int edgesum;
};
Map mp;
bool SPFA(int sourse)
{
deque<int> dq;
int i, j, from, to;
for (i = 1; i <= mp.nodesum; i++)
{
mp.in_sum[i] = 0;
mp.in_queue[i] = false;
mp.dist[i] = INF;
mp.path[i] = -1;
}
dq.push_back(sourse);
mp.in_sum[sourse]++;
mp.dist[sourse] = 0;
mp.in_queue[sourse] = true;
while (!dq.empty()) {
from = dq.front();
dq.pop_front();
mp.in_queue[from] = false;
for (i = 0; i < mp.adjmap[from].size(); i++)
{
to = mp.adjmap[from][i].to;
if ((mp.dist[from]<INF) && (mp.dist[to]>mp.dist[from] + mp.adjmap[from][i].weight))
{
mp.dist[to] = mp.dist[from] + mp.adjmap[from][i].weight;
mp.path[to] = from;
if (!mp.in_queue[to]) {
mp.in_queue[to] = true;
mp.in_sum[to]++;
if (mp.in_sum[to] == mp.nodesum)
return false;
if (!dq.empty())
{
if (mp.dist[to] > mp.dist[dq.front()])
dq.push_back(to);
else
dq.push_front(to);
}
else
dq.push_back(to);
}
}
}
}
return true;
}
int Get_SPFA(int goal)
{
return mp.dist[goal];
}
int main()
{
int i,start,sourse, goal;
edge temp;
int f;
while (scanf_s("%d %d %d %d", &mp.nodesum, &mp.edgesum, &sourse, &goal) != EOF) {
for (i = 1; i <= mp.nodesum; i++)
mp.adjmap[i].clear();
for (i = 1; i <= mp.edgesum; i++)
{
scanf_s("%d %d %d", &start, &temp.to, &temp.weight);
mp.adjmap[start].push_back(temp);
f = temp.to;
temp.to = start;
start = f;
mp.adjmap[start].push_back(temp);
}
if (SPFA(sourse))
{
printf("%d\n", Get_SPFA(goal));
}
}
return 0;
}
相关文章推荐
- 详解图的应用(最小生成树、拓扑排序、关键路径、最短路径)
- python编写的最短路径算法
- 【算法】最短路径之A*搜索
- Dijkstra和floyd——求单源点最短路径
- 初学图论-Dijkstra单源最短路径算法基于优先级队列(Priority Queue)的实现
- poj 1511 Invitation Cards
- 最少步数BFS
- CSU1307 并查集+SPFA
- 想讨论一个指定必经节点求最短路径思路,大伙有什么思路没有?
- 最短路径 -- spfa
- 单源最短路深度分析
- Six Degrees of Cowvin Bacon(最短路径floyd算法)
- 最短路径问题迪杰斯特拉(Dijkstra)Android 测试
- HUD----3790最短路径问题
- dijkstra_最短路径_hdu_3790
- poj_1135_最短路径&枚举
- hdu1874 最短路径 畅通工程续
- arcgis for android 短路径分析 查找最短路径
- 单源最短路径 : Bellman-Ford 算法
- 每对顶点的最短路径 : 基本算法