Spfa 解法
/* THE PROGRAM IS MADE BY PYY */
/*----------------------------------------------------------------------------//
Copyright (c) 2011 panyanyany All rights reserved.
URL : http://acm.hdu.edu.cn/showproblem.php?pid=2962
Name : 2962 Trucking
Date : Thursday, January 19, 2012
Time Stage : one hour
Result:
5276304 2012-01-19 18:31:14 Accepted 2962
250MS 596K 2705 B
C++ pyy
Test Data :
Review :
根据华神指点,特用 spfa 做一次,发现邻接表要比矩阵快很多啊
//----------------------------------------------------------------------------*/
#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>
using namespace std ;
#define INF 0x3f3f3f3f
#define MAXN 1002
#define min(x, y) ((x) < (y) ? (x) : (y))
#define max(x, y) ((x) > (y) ? (x) : (y))
#define MEM(a, v) memset (a, v, sizeof (a))
struct EDGE {
int to ;
int hei, dis ;
};
bool used[MAXN] ;
int c, r ;
int dist[MAXN] ;
vector<EDGE> map[MAXN] ;
int spfa (const int beg, const int end, const int lim)
{
queue<int> q ;
EDGE e ;
int i, t ;
MEM (dist, INF) ;
MEM (used, 0) ;
q.push (beg) ;
used[beg] = 1 ;
dist[beg] = 0 ;
while (!q.empty ())
{
t = q.front () ;
q.pop () ;
for (i = 0 ; i < map[t].size() ; ++i)
{
e = map[t][i] ;
if (e.hei >= lim && dist[t] + e.dis < dist[e.to])
{
// !used[e.to] 不能写到上面的判断里去。
/*
5 6
1 2 7 5
1 3 4 2
2 4 -1 10
2 5 2 4
3 4 10 1
4 5 8 5
1 5 4
在这个例子中,4 先被 3 入队,used[4] = 1,
当 3 的所有边遍历完后,遍历 2 的所有边,此时发现 4 已经入队,则 dist[4] 就无法
更新,而且 2 不会再次入队,所以 1-->4 的最短路只能经过 3,而不能经过 2。
*/
dist[e.to] = dist[t] + e.dis ;
if (!used[e.to])
{
used[e.to] = 1 ;
q.push (e.to) ;
}
}
}
used[t] = 0 ;
}
return dist[end] ;
}
void init ()
{
int i ;
for (i = 1 ; i <= c ; ++i)
map[i].clear () ;
}
int main ()
{
int i ;
int x, y, h, d ;
int res, low, high, mid, ans ;
int tcase ;
tcase = 0 ;
while (scanf ("%d%d", &c, &r), c | r)
{
EDGE e ;
init () ;
for (i = 1 ; i <= r ; ++i)
{
scanf ("%d%d%d%d", &x, &y, &h, &d) ;
h = (h == -1 ? INF : h) ;
e.to = y ;
e.hei = h ;
e.dis = d ;
map[x].push_back(e) ;
e.to = x ;
map[y].push_back(e) ;
}
scanf ("%d%d%d", &x, &y, &high) ;
// 二分查找,暴力枚举所有高度
low = 1 ;
res = INF ;
while (low <= high)
{
mid = (low + high) / 2 ;
res = spfa (x, y, mid) ;
if (INF == res)
high = mid - 1 ;
else
{
low = mid + 1 ;
ans = res ;
h = mid ;
}
}
if (tcase)
putchar ('\n') ;
printf ("Case %d:\n", ++tcase) ;
if (ans != INF)
{
printf ("maximum height = %d\nlength of shortest route = %d\n",
h, ans) ;
}
else
printf ("cannot reach destination\n") ;
}
return 0 ;
}
Dijks解法
/* THE PROGRAM IS MADE BY PYY */
/*----------------------------------------------------------------------------//
Copyright (c) 2011 panyanyany All rights reserved.
URL : http://acm.hdu.edu.cn/showproblem.php?pid=2962
Name : 2962 Trucking
Date : Thursday, January 19, 2012
Time Stage : 7 hours
Result:
5275934 2012-01-19 17:01:40 Accepted 2962
1843MS 8076K 2663 B
C++ pyy
Test Data :
Review :
好吧,有点太浪费时间了……
//----------------------------------------------------------------------------*/
#include <stdio.h>
#include <string.h>
#define INF 0x3f3f3f3f
#define MAXN 1002
#define min(x, y) ((x) < (y) ? (x) : (y))
#define max(x, y) ((x) > (y) ? (x) : (y))
#define MEM(a, v) memset (a, v, sizeof (a))
bool used[MAXN] ;
int c, r ;
int map[MAXN][MAXN], heig[MAXN][MAXN], dist[MAXN], hi[MAXN] ;
int dijkstra (const int beg, const int end, const int lim)
{
int i, j ;
int iMinPath, MinPath ;
MEM (used, 0) ;
MEM (hi, 0) ;
MEM (dist, INF) ;
for (i = 1 ; i <= c ; ++i)
{
// 根据华神指点,加了这里。
// 这里不加,屡次WA
// 虽然后面的更新操作也限制了高度,但万一起点到终点本来就有边,
// 高度却不合适呢?
if (heig[beg][i] >= lim)
{
dist[i] = map[beg][i] ;
hi[i] = heig[beg][i] ;
}
}
// 第一次 WA 后增加下两句
dist[beg] = 0 ;
hi[beg] = INF ;
for (i = 1 ; i <= c ; ++i)
{
iMinPath = 0 ;
MinPath = INF ;
for (j = 1 ; j <= c ; ++j)
{
if (!used[j] &&
hi[j] >= lim &&
dist[j] < MinPath)
{
iMinPath = j ;
MinPath = dist[j] ;
}
}
used[iMinPath] = 1 ;
for (j = 1 ; j <= c ; ++j)
{
if (!used[j] &&
heig[iMinPath][j] >= lim &&
dist[iMinPath] + map[iMinPath][j] < dist[j])
{
dist[j] = dist[iMinPath] + map[iMinPath][j] ;
hi[j] = min(hi[iMinPath], heig[iMinPath][j]) ;
}
}
}
return dist[end] ;
}
int main ()
{
int i, j ;
int x, y, h, d ;
int res, low, high, mid, tmp1, tmp2 ;
int tcase ;
tcase = 0 ;
while (scanf ("%d%d", &c, &r), c | r)
{
MEM(map, INF) ;
MEM(heig, 0) ;
for (i = 1 ; i <= r ; ++i)
{
scanf ("%d%d%d%d", &x, &y, &h, &d) ;
map[x][y] = map[y][x] = d ;
heig[x][y] = heig[y][x] = (h == -1 ? INF : h) ;
}
scanf ("%d%d%d", &x, &y, &h) ;
low = 1 ; // 第四次 WA,改为 1
high = h ;
res = INF ;
while (low <= high)
{
mid = (low + high) / 2 ;
tmp1 = dijkstra (x, y, mid) ;
if (INF == tmp1)
high = mid - 1 ;
else
{
low = mid + 1 ;
res = tmp1 ;
tmp2 = mid ;
}
}
if (tcase)
putchar ('\n') ;
printf ("Case %d:\n", ++tcase) ;
if (res != INF)
{
printf ("maximum height = %d\nlength of shortest route = %d\n",
tmp2, res) ;
}
else
printf ("cannot reach destination\n") ;
}
return 0 ;
}
分享到:
相关推荐
基于Pyqt5+Dijkstra算法实现的校园地图导览python源码 基于Pyqt5+Dijkstra算法实现的校园地图导览python源码 基于Pyqt5+Dijkstra算法实现的校园地图导览python源码 基于Pyqt5+Dijkstra算法实现的校园地图导览python...
《杭电HDU ACM培训课件》是一份珍贵的学习资源,源自杭州电子科技大学的ACM竞赛培训课程。这些课件是官方论坛上分享的,旨在为那些积分不足无法获取资源或者对ACM编程竞赛感兴趣的初学者提供帮助。下面将详细阐述这...
毕设项目:基于springboot+mysql+Dijkstra算法实现物流优化管理系统.zip主要针对计算机相关专业的正在做课程设计和期末大作业的学生和需要项目实战练习的学习者。包含全部项目源码、该项目可以直接使用、项目都经过...
SPFA算法 此处为SPFA算法详解 用dis数组记录源点到有向图上任意一点距离,其中源点到自身距离为0,到其他点距离为 INF。将源点入队,并重复以下步骤: 1、队首x出队 2、遍历所有以队首为起点的有向边(x,i),若...
基于java+dijkstra算法实现上海地铁换乘线路的查询+源码+实现原理解析,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于java+dijkstra算法实现上海地铁换乘...
最短路算法进阶(链式前向星+堆优化+SPFA) ...本文介绍了链式前向星、dijkstra算法、堆优化和SPFA算法等最短路算法的进阶知识,这些知识点对于OIer来说非常重要,可以帮助他们更好地解决最短路问题。
代码 基于最短路dijkstra算法离散优化问题代码代码 基于最短路dijkstra算法离散优化问题代码代码 基于最短路dijkstra算法离散优化问题代码代码 基于最短路dijkstra算法离散优化问题代码代码 基于最短路dijkstra算法...
毕设项目:基于springboot+mysql+Dijkstra算法实现物流优化管理系统 本资源中的源码都是经过本地编译过可运行的,下载后按照文档配置好环境就可以运行。资源项目的难度比较适中,内容都是经过专业老师审定过的,...
做ACM最短路问题普遍算法的Floyd-Dijkstra-Spfa板子..
标题中的“最短路径+dijkstra+matlab代码+算法效率测试”揭示了本文将要讨论的是图论中的一个经典算法——Dijkstra算法,并且在MATLAB环境下实现与测试该算法的效率。MATLAB是一款强大的数学计算软件,常用于科学...
【作品名称】:基于Matlab+Dijkstra和时间窗规划的AGV调度算法 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:基于...
1、基于springboot+mysql+Dijkstra算法实现物流优化管理系统源码+项目说明(课程设计).zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大...
相比于Bellman-Ford算法,SPFA在实践中通常更快,但其最坏情况下的时间复杂度仍为O(n^2)。SPFA对于稀疏图,即边的数量远小于节点数量的情况,表现良好。 链式前向星存图是一种常用的图存储结构,它使用邻接表而非...
【蚁群算法】 改进蚁群算法 Dijkstra算法 遗传算法 人工势场法实现二维 三维空间路径规划 本程序为蚁群算法+Dijkstra算法+MAKLINK图理论实现的二维空间路径规划 算法实现: 1)基于MAKLINK图理论生成地图,并对可行...
AGV调度_基于Matlab+Dijkstra算法+时间窗规划实现的AGV调度算法_附项目源码_优质项目实战
基于Pyqt5+Dijkstra算法实现的校园地图导览python源码+项目使用说明.zip 语言:Python 主要依赖包: PyQt5 主要算法: Dijkstra 通过工程文件 - > 在配置好的IDE中运行 main.py - > 或cd 进入工程目录 python -...
最短路径Dijkstra算法是图论中的一个经典算法,由荷兰计算机科学家艾兹格·迪科斯彻在1956年提出,主要用于解决单源最短路径问题。该算法适用于加权有向或无向图,寻找从起始节点到其他所有节点的最短路径。在实际...