最短路
文章平均质量分 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 · 412 阅读 · 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 · 321 阅读 · 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 · 241 阅读 · 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 · 313 阅读 · 0 评论 -
POJ3268-Silver Cow Party
n头牛要从原来的位置到x位置再回到原先位置,求来回最短路中最长的花费。 从x回到原来位置可看作单源最短路,但每头牛到x位置的时间不能间接得出。因此将图取反,可转换为反向后的单源最短路来求。 这段代码的不足在于使用的spfa中有两段相似代码,可加以改进后使代码更加简洁。 #include #include #include #include #include using names原创 2016-07-18 21:04:54 · 286 阅读 · 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 · 377 阅读 · 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 · 400 阅读 · 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 · 429 阅读 · 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 · 387 阅读 · 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 · 370 阅读 · 0 评论 -
POJ3169-Layout
首先,牛是按照编号排序的,所以有d[i] 其次,对于每对关系好的牛之间都有d[Al]+Dl>=d[Bl]。 同样,对于每对关系不好的牛之间都有d[Ad]+Dd d[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 · 320 阅读 · 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 · 471 阅读 · 0 评论
分享