最短路
文章平均质量分 79
yrleep
大学毕业不久,ios游戏自由开发者。
展开
-
poj 1135 Domino Effect 单源最短…
单源最短路径的一个变形 解法:先求出单源最短路 ans[i][j]表示i到j这条边上最后倒下的domino骨牌倒下的时间 ans[i][j]=(dist[i]+dist[j]+e[i][j])/2.0 ps:在双向边上wa了,并且在边的初始化上wa了,非常2的把边的初始值定为了0,并且计算ans[i][j]时没有对边是否存在做判断 #include #include #i原创 2013-04-14 19:37:16 · 586 阅读 · 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 · 595 阅读 · 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 · 596 阅读 · 0 评论 -
poj 3635 Full Tank 最短路
题意:每个城市的油价可能不相同,求从一个城市到另外一个城市的最小花费 这个题目第一个解法用的是spfa,求出每个顶点的d[i][j],到达第i个城市,剩余j油量的最小花费,t了 然后开始加入一些剪枝,第一个剪枝,当当前费用已经大于到达目标点的估计费用时,不在拓展 第二个剪枝,当前点的油量不足以到达其他任何一个城市时,只加油,不再枚举每条边 第三个:对第一个剪枝的优化,对当前点的费用加原创 2013-04-14 19:37:25 · 539 阅读 · 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 · 969 阅读 · 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 · 749 阅读 · 0 评论 -
poj 3271 Lilypad Pond bfs
因为有了1的存在,使得问题变得比较难搞了,所以比较简单的做法就是把1去掉,先做一次bfs,处理出每个点能够一步到达的点(一定是1步). 然后就可以在新图上用bfs算出两个点之间的最短路,和最短路的个数。(至于原题问的为什么是这个,很简单,因为建造的香蒲要最少,所以不会重复建造,不会多建造,所以就是求最短路,至于路径数,因为现在路径长度是简单递增的,所以直接累加就可以了)。 #include原创 2013-09-03 00:25:27 · 1398 阅读 · 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 · 764 阅读 · 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 · 848 阅读 · 0 评论 -
hdu 4081 最小生成树变形
题目意思是给你一个完全图,每个点有一个权值。 求一棵生成树。你可以使其中一条边权值变成0.使得该边两点的权值和除以生成树的边劝和最小。 思路: 具有最优解的树一定有这么一个性质。除了权值变成0的边外,其余的边都必须是最小生成树的边。 基于这点,我们就可以先求出最小生成树,然后枚举的删边。删了一条边之后就变成了两个独立集, 而我们要在这两个集合中找一条边,使得它具有最优解。注原创 2013-04-14 19:39:50 · 603 阅读 · 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 · 573 阅读 · 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 · 555 阅读 · 0 评论 -
poj 1364 King 差分约束
差分约束系统 写了两种解法 第一种是bellman-ford 第二种是spfa #include #include #include using namespace std; const int maxn=302; const int inf=1 int e[maxn][maxn]; int n,m; int dist[maxn]; int solve() { for(int i原创 2013-04-14 19:37:34 · 481 阅读 · 0 评论 -
poj 1062 昂贵的聘礼 最短路
spfa 由于地位的限制 所以松弛的条件改成价格比原价小既能更新 每个节点需要保存最大地位与最小地位 #include int m,n; struct node { int e; int mon; }a[101][101]; int d1[101]; short queue[1000001]; int front,end; struct note { int sum;原创 2013-04-14 19:36:49 · 561 阅读 · 0 评论 -
poj 2421 Constructing Roads mst(…
mst问题 对已经建好的路把路径更改为一,然后就可以上经典的prim算法 或者可以用库鲁思卡尔算法,建好的路径相当于把集合并在了一起,不过这样的话,克鲁斯卡尔结束的条件就要修改成当所有的元素都在同一个集合里面 #include #include #include int d[101][101]; using namespace std; int min(int key[],int n) {原创 2013-04-14 19:36:53 · 680 阅读 · 0 评论 -
poj 2349 Arctic Network mst(最小…
s个卫星可以把s个连通分量给连接起来 所以题目变成把图构成s个联通量的最长边的最小值 考虑最小生成树的性质 最小生成树的边的第k大边也是所有生成树中最小的 所以答案就是求成最小生成树,然后输出第n-s条边 #include #include #include #include double d[501][501]; struct { int x,y; }a[501]; using原创 2013-04-14 19:36:55 · 492 阅读 · 0 评论 -
poj 3463 最短路和比最短路小1的路…
利用dijkstra求出最短路和次短路,并求出其路径数 d[1~n] 最短路 d[n+1~2*n] 次短路 ans[2*n] 路径数 每次找出具有最短路径估计值的点,将其标记为确定的最短路径,并用其更新其余的点 关键的思路:最短路径递增,所以每次最小的路径为确定的最短路径(也就是dijkstra算法的关键思想) ps这里讲最短路和次短路标记为两个点,是为了更方便的找出具有最短路径估计值的点原创 2013-04-14 19:37:10 · 496 阅读 · 0 评论 -
poj 1251 Jungle Roads 最小生成树
一个裸的最小生成树 没有太多可以讲的了 就是注意一下输入 #include #include #include using namespace std; const int maxn=1001; const int inf=1 int e[maxn][maxn]; int n; int min(int key[],int txt[]) { int ret=inf,tmp; for原创 2013-04-14 19:37:19 · 622 阅读 · 0 评论 -
poj 2240 Arbitrage spfa求正环
这个题目意思很明确 就是找一个环使得钱能增加,也就是一个正环 我的做法,每个点依次做spfa,判断有没有正环。 #include #include #include using 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 · 599 阅读 · 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 · 1303 阅读 · 0 评论