生成树
文章平均质量分 78
yrleep
大学毕业不久,ios游戏自由开发者。
展开
-
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 · 688 阅读 · 0 评论 -
hdu 4126 Genghis Khan the Conqueror 最小生成树变形
先求最小生成树,然后dfs求生成树的最小替代边。#include #include #include using namespace std;const int maxn=3e3+9,inf=1e9;int n,m;int dist[maxn],g[maxn][maxn],tree[maxn][maxn];int f[maxn][maxn];struct{ int原创 2013-09-24 01:08:07 · 1284 阅读 · 0 评论 -
poj 4756 Install Air Conditioning 生成树变形
南京网络赛的题目题意:有一条边不能用,但不知道是哪条,问最坏情况的最小生成树的大小。思路:最容易想到的做法就是求最小生成树,然后枚举的删去最小生成树上的边,再求最小生成树,取最大值。n^3, 超时 那么可以用求次小生成树的思想,求出每条最小生成树上的边的最小替代边。这个可以用树形dp的思想n^2解决。#include #inclu原创 2013-09-23 18:14:02 · 1216 阅读 · 0 评论 -
poj 3635 Full Tank 最短路
题意:每个城市的油价可能不相同,求从一个城市到另外一个城市的最小花费 这个题目第一个解法用的是spfa,求出每个顶点的d[i][j],到达第i个城市,剩余j油量的最小花费,t了然后开始加入一些剪枝,第一个剪枝,当当前费用已经大于到达目标点的估计费用时,不在拓展第二个剪枝,当前点的油量不足以到达其他任何一个城市时,只加油,不再枚举每条边第三个:对第一个剪枝的优化,对当前点的费用加原创 2013-04-14 19:37:25 · 547 阅读 · 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 · 605 阅读 · 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 · 607 阅读 · 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 · 606 阅读 · 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 · 490 阅读 · 0 评论 -
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 · 594 阅读 · 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 · 501 阅读 · 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 · 569 阅读 · 0 评论 -
hdu 4081 最小生成树变形
题目意思是给你一个完全图,每个点有一个权值。求一棵生成树。你可以使其中一条边权值变成0.使得该边两点的权值和除以生成树的边劝和最小。思路: 具有最优解的树一定有这么一个性质。除了权值变成0的边外,其余的边都必须是最小生成树的边。 基于这点,我们就可以先求出最小生成树,然后枚举的删边。删了一条边之后就变成了两个独立集, 而我们要在这两个集合中找一条边,使得它具有最优解。注原创 2013-04-14 19:39:50 · 613 阅读 · 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 · 578 阅读 · 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 · 563 阅读 · 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 · 631 阅读 · 0 评论 -
poj 3463 最短路和比最短路小1的路…
利用dijkstra求出最短路和次短路,并求出其路径数d[1~n] 最短路d[n+1~2*n] 次短路ans[2*n] 路径数每次找出具有最短路径估计值的点,将其标记为确定的最短路径,并用其更新其余的点 关键的思路:最短路径递增,所以每次最小的路径为确定的最短路径(也就是dijkstra算法的关键思想) ps这里讲最短路和次短路标记为两个点,是为了更方便的找出具有最短路径估计值的点原创 2013-04-14 19:37:10 · 506 阅读 · 0 评论 -
poj 1639 Picnic Planning
有度限制的最小生成树。解法网上很多,就不再叙述了。#include #include #include using namespace std;const int maxn=1e2+9,inf=5e7;char a[maxn][maxn];int n,m,limit;int head[maxn],lon,visit[maxn],dist[maxn],distfrom[maxn原创 2013-10-15 22:14:39 · 715 阅读 · 0 评论