最短路
文章平均质量分 79
yrleep
大学毕业不久,ios游戏自由开发者。
展开
-
poj 1135 Domino Effect 单源最短…
单源最短路径的一个变形解法:先求出单源最短路ans[i][j]表示i到j这条边上最后倒下的domino骨牌倒下的时间ans[i][j]=(dist[i]+dist[j]+e[i][j])/2.0ps:在双向边上wa了,并且在边的初始化上wa了,非常2的把边的初始值定为了0,并且计算ans[i][j]时没有对边是否存在做判断#include #include#i原创 2013-04-14 19:37:16 · 580 阅读 · 0 评论 -
poj 3615 Cow Hurdles floyed
floyed 这个题目能想到就没什么难的了,就是个floyed i,j最优的路径i->k->j那么i->k也是最优的。 所以满足最优子结构,所以就可以像floyed算法那样dp的去解决。#include #include #include using namespace std;const int maxn=3e2+9,inf=1684300原创 2013-04-14 19:41:10 · 590 阅读 · 0 评论 -
poj 3662 Telephone Lines 图论
最短路径的变形题目意思: 找一条连接1到n的路径,其中k条路径免费,剩下的边最大的就是花费,要求花费最小。解法:ans[i][j]表示到达i顶点,使用了j条免费边的花费。然后就用spfa的那种思想来搞就行了。#include #include #include #include using namespace std;const原创 2013-04-14 19:40:46 · 588 阅读 · 0 评论 -
poj 3635 Full Tank 最短路
题意:每个城市的油价可能不相同,求从一个城市到另外一个城市的最小花费 这个题目第一个解法用的是spfa,求出每个顶点的d[i][j],到达第i个城市,剩余j油量的最小花费,t了然后开始加入一些剪枝,第一个剪枝,当当前费用已经大于到达目标点的估计费用时,不在拓展第二个剪枝,当前点的油量不足以到达其他任何一个城市时,只加油,不再枚举每条边第三个:对第一个剪枝的优化,对当前点的费用加原创 2013-04-14 19:37:25 · 534 阅读 · 0 评论 -
poj 3613
用矩阵来表示两个点之间走k步的最短路,然后二分k。#include #include #include #include using namespace std;typedef long long ll;const int maxn=1e3+9;set q;int a[maxn];int f[maxn][maxn];long long d[211][211];const原创 2013-07-08 22:57:53 · 965 阅读 · 0 评论 -
poj 3169 layout
#include #include #include #include using namespace std;const int maxn=1e3+9,inf=1e6+9;struct{ int to,next,w;}e[maxn*20*2];int head[maxn],lon;int n,ml,md;void edgeini(){ memset(hea原创 2013-09-07 23:34:34 · 740 阅读 · 0 评论 -
poj 3271 Lilypad Pond bfs
因为有了1的存在,使得问题变得比较难搞了,所以比较简单的做法就是把1去掉,先做一次bfs,处理出每个点能够一步到达的点(一定是1步).然后就可以在新图上用bfs算出两个点之间的最短路,和最短路的个数。(至于原题问的为什么是这个,很简单,因为建造的香蒲要最少,所以不会重复建造,不会多建造,所以就是求最短路,至于路径数,因为现在路径长度是简单递增的,所以直接累加就可以了)。#include原创 2013-09-03 00:25:27 · 1390 阅读 · 0 评论 -
poj Sightseeing Cows 分数规划+spfa
分数规划的标准做法,先二分答案,然后spfa找正环。#include #include #include using namespace std;const int maxn=1e3+9,maxm=5e3+9;double a[maxn];int head[maxn],lon;struct{ int to,next,w;}e[maxm<<1];void edgein原创 2013-09-12 00:14:14 · 759 阅读 · 0 评论 -
poj 3182 The Grove bfs
思路:如果要围绕一圈,必须经过一条竖线上的一点,把竖线左端封住,bfs一次,枚举点,再把竖线右端封住,再bfs回起点。#include #include #include using namespace std;const int maxn=5e1+9,inf=1e9;char a[maxn][maxn],now[maxn][maxn];int dist[maxn][maxn]原创 2013-10-05 14:24:25 · 838 阅读 · 0 评论 -
hdu 4081 最小生成树变形
题目意思是给你一个完全图,每个点有一个权值。求一棵生成树。你可以使其中一条边权值变成0.使得该边两点的权值和除以生成树的边劝和最小。思路: 具有最优解的树一定有这么一个性质。除了权值变成0的边外,其余的边都必须是最小生成树的边。 基于这点,我们就可以先求出最小生成树,然后枚举的删边。删了一条边之后就变成了两个独立集, 而我们要在这两个集合中找一条边,使得它具有最优解。注原创 2013-04-14 19:39:50 · 595 阅读 · 0 评论 -
poj 2631 Roads in…
就是给你一棵树,求其上距离最远的两点的距离有一个性质,就是先任意找一个点h求距离它最远的点s(距离为d[s]),然后从s出发找一个距离它最远的点t(距离d[t]),那么d[t]就是其直径。原因,这么考虑,如果这一次求出来的不是直径那么证明存在一条比它更长的路径,并且它的两个点到h的距离都小于d[s]。接下来的情况不好说明,但是可以想象出来,用s节点去跟假设出来的直径中的两个点去构造,绝原创 2013-04-14 19:39:24 · 569 阅读 · 0 评论 -
poj 2449 Remmarguts' Date 第k最…
求第k最短路这里要说的就比较多了,朴素的方法有两种实现的办法1:spfa求,当把所有顶点的前k临时最短路都求出时,前k临时最短路就是确切的最短路,因为第k+1短路不能更新第k以内的最短路2:dijkstra求,用宽搜实现该算法,第k次搜该顶点时,即为该顶点的第k最短路,因为是宽搜,所以保证后边的所有路径都比它长,因此该算法的正确性得到保证但是前边两种做法都会tle 3:网上流传的原创 2013-04-14 19:37:23 · 546 阅读 · 0 评论 -
poj 1364 King 差分约束
差分约束系统写了两种解法第一种是bellman-ford第二种是spfa #include #include#includeusing namespace std;const int maxn=302;const int inf=1int e[maxn][maxn];int n,m;int dist[maxn];int solve(){ for(inti原创 2013-04-14 19:37:34 · 475 阅读 · 0 评论 -
poj 1062 昂贵的聘礼 最短路
spfa由于地位的限制所以松弛的条件改成价格比原价小既能更新每个节点需要保存最大地位与最小地位 #include int m,n;struct node{ int e; intmon;}a[101][101];int d1[101];short queue[1000001];int front,end;struct note{ intsum;原创 2013-04-14 19:36:49 · 555 阅读 · 0 评论 -
poj 2421 Constructing Roads mst(…
mst问题对已经建好的路把路径更改为一,然后就可以上经典的prim算法或者可以用库鲁思卡尔算法,建好的路径相当于把集合并在了一起,不过这样的话,克鲁斯卡尔结束的条件就要修改成当所有的元素都在同一个集合里面#include #include#includeint d[101][101];using namespace std;int min(int key[],int n){原创 2013-04-14 19:36:53 · 672 阅读 · 0 评论 -
poj 2349 Arctic Network mst(最小…
s个卫星可以把s个连通分量给连接起来所以题目变成把图构成s个联通量的最长边的最小值考虑最小生成树的性质最小生成树的边的第k大边也是所有生成树中最小的 所以答案就是求成最小生成树,然后输出第n-s条边 #include #include#include#includedouble d[501][501];struct{ intx,y;}a[501];using原创 2013-04-14 19:36:55 · 486 阅读 · 0 评论 -
poj 3463 最短路和比最短路小1的路…
利用dijkstra求出最短路和次短路,并求出其路径数d[1~n] 最短路d[n+1~2*n] 次短路ans[2*n] 路径数每次找出具有最短路径估计值的点,将其标记为确定的最短路径,并用其更新其余的点 关键的思路:最短路径递增,所以每次最小的路径为确定的最短路径(也就是dijkstra算法的关键思想) ps这里讲最短路和次短路标记为两个点,是为了更方便的找出具有最短路径估计值的点原创 2013-04-14 19:37:10 · 491 阅读 · 0 评论 -
poj 1251 Jungle Roads 最小生成树
一个裸的最小生成树没有太多可以讲的了就是注意一下输入#include #include#includeusing namespace std;const int maxn=1001;const int inf=1int e[maxn][maxn];int n;int min(int key[],int txt[]){ intret=inf,tmp; for原创 2013-04-14 19:37:19 · 615 阅读 · 0 评论 -
poj 2240 Arbitrage spfa求正环
这个题目意思很明确就是找一个环使得钱能增加,也就是一个正环我的做法,每个点依次做spfa,判断有没有正环。#include#include#includeusing namespace std;const int maxn=1001;char a[31][1001];int head[31],lon,n;struct{ int to,next; doub原创 2013-04-14 19:39:18 · 591 阅读 · 0 评论 -
poj 2432 Around the world bfs+哈希
由于每个点的状态包含走过来的距离,所以要存二维的状态,但是状态总量太多,所以可以用哈希来搞。那么就是bfs最短路,哈希记录状态了。#include #include #include using namespace std;const int maxn=5e3+9;int n,m;int a[maxn];struct{ struct {原创 2013-09-26 17:13:47 · 1297 阅读 · 0 评论