
最短路
文章平均质量分 57
stdwal
天演在化,功成在学。知海无涯,见花问道。
展开
-
POJ3255-Roadblocks
寻找次短路。令dis[]为点到源点的最小距离,dist[]为点到终点的最小距离。由此可知dis[u] + dist[u]为从源点到终点的最短路。dis[u] + cost[u][v] + dist[v]表示源点通过uv边到终点,次短路一定是其中比最短路大比其他路小的值。因此只要求出每个点到源点的距离和每个点到终点的距离即可。#include #include #includ原创 2016-05-26 20:25:36 · 377 阅读 · 0 评论 -
POJ1724-ROADS
给定k元钱,要求满足在k元钱内的最短路。 虽然是最短路问题,但是由于它的限制条件,在设计算法时也无需更新最短路,因此采用Bfs与优先队列结合的算法,通过优先队列不断取出符合条件的“最短路”。#include <cstdio>#include <vector>#include <queue>#include <algorithm>using namespace std;const int ma原创 2016-10-23 20:04:12 · 293 阅读 · 0 评论 -
POJ1125-Stockbroker Grapevine
floyd找出多源最短路后从中选择一个源点。 以该源点出发最大花费最小即满足条件。#include <cstdio>#include <algorithm>using namespace std;const int maxn = 105;const int inf = 1000 + 24;int d[maxn][maxn];void floyd(int n) { for (int k原创 2016-08-16 09:35:16 · 215 阅读 · 0 评论 -
POJ1860-Currency Exchange
这道题讲述了城里有几个点能过换钱问能否套利。只要用Bellmen_Ford判断图中是否含有负圈即可。#include #include const int maxn = 100 + 5;const int maxm = 100 + 5;struct Edge { int from; int to; double rate; double com;原创 2016-07-08 15:12:00 · 269 阅读 · 0 评论 -
POJ3268-Silver Cow Party
n头牛要从原来的位置到x位置再回到原先位置,求来回最短路中最长的花费。从x回到原来位置可看作单源最短路,但每头牛到x位置的时间不能间接得出。因此将图取反,可转换为反向后的单源最短路来求。这段代码的不足在于使用的spfa中有两段相似代码,可加以改进后使代码更加简洁。#include #include #include #include #include using names原创 2016-07-18 21:04:54 · 261 阅读 · 0 评论 -
POJ3259-Wormholes
一个图中有双向边和单向的负边,考虑有没有负圈#include #include const int maxn = 510;const int maxm = 6000;struct edge { int from, to, cost;};edge es[maxm];int d[maxn];bool Bellman_Ford(int v, int e) {原创 2016-07-18 10:41:54 · 349 阅读 · 0 评论 -
POJ2139-Six Degrees of Cowvin Bacon
题目的意思是在同一电影中每头牛的距离都为1用floyd就能简单的做出来。#include #include using namespace std;const int maxn = 300 + 10;const int inf = 10000;int d[maxn][maxn];int tmp[maxn];void floyd(int n) { for (in原创 2016-07-10 14:00:33 · 364 阅读 · 0 评论 -
POJ2240-Arbitrage
货币套利问题。每种货币根据不同汇率兑换到不同的货币再兑换回原货币,如果价值比原来更高即是套利。这个一个多源问题,利用Floyd变形即可。#include #include #include #include #include #include using namespace std;const int MAXN = 35;double G[MAXN][MAXN];ma原创 2016-06-02 09:39:19 · 386 阅读 · 0 评论 -
POJ2253-Frogger
题目要求找出点0到点1在每个路径中跳跃距离的最大值中最小的一个。首先初始化数组d,d[i][j]表示从点i跳到点j的最小跳跃距离。将Floyed-Warshall算法变形一下,用临时变量存取从点i跳到点k的最小跳跃距离与点k到点j的最小跳跃距离中的最大值(同一路径取最大值)将该临时变量与以求得的最短跳跃距离d[i][j]比较,取里面最小的一个。#include #includ原创 2016-05-28 21:44:54 · 362 阅读 · 0 评论 -
POJ1062-昂贵的聘礼
取源点为0,首先建立从0到各个编号的物品的单向边,权值为物品价格。由于一个物品a需要用另一个物品b来优惠,因此建立从b到a的单向边,权值为优惠后的价格。枚举在物品1(酋长的允诺)的地位lev[1]-m范围内的物品地位i在地位i+m的可交易范围内到源点的最短路。则d[1]就是最小的金额。#include #include #include #include #include原创 2016-05-28 16:37:02 · 351 阅读 · 0 评论 -
POJ3169-Layout
首先,牛是按照编号排序的,所以有d[i]其次,对于每对关系好的牛之间都有d[Al]+Dl>=d[Bl]。同样,对于每对关系不好的牛之间都有d[Ad]+Ddd[i]=d[i],因此从顶点i+1向顶点i连一条权值为0的边。同样,d[Al]+Dl>=d[Bl]对应从顶点Al向顶点Bl连一条权值为d[Bl]的边。d[Ad]+Dd所求问题是d[n]-d[1]的最大值,对应顶点1到顶点原创 2016-05-27 22:42:41 · 291 阅读 · 0 评论 -
Ural1126-Magnetic Storms
给定一个区间长度n和一串数字,以-1结尾,输出每段长度为n的连续数中的最大值.#include <cstdio>#include <deque>#include <algorithm>using namespace std;typedef pair<int, int> P;int main(int argc, char const *argv[]) { int n; scanf(原创 2016-11-18 15:49:42 · 437 阅读 · 0 评论