树—图论
文章平均质量分 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 · 680 阅读 · 0 评论 -
poj 3635 Full Tank 最短路
题意:每个城市的油价可能不相同,求从一个城市到另外一个城市的最小花费 这个题目第一个解法用的是spfa,求出每个顶点的d[i][j],到达第i个城市,剩余j油量的最小花费,t了然后开始加入一些剪枝,第一个剪枝,当当前费用已经大于到达目标点的估计费用时,不在拓展第二个剪枝,当前点的油量不足以到达其他任何一个城市时,只加油,不再枚举每条边第三个:对第一个剪枝的优化,对当前点的费用加原创 2013-04-14 19:37:25 · 539 阅读 · 0 评论 -
poj 1470 Closest Common Ancestors
最近公共祖先的题目。第一个点不一定是跟。#include #include #include using namespace std;const int maxn=900+9;int head[maxn],lon,qhead[maxn],qlon;int ans[maxn],chk[maxn],f[maxn],in[maxn];struct node{原创 2013-05-08 21:20:38 · 722 阅读 · 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 3275 Ranking the Cows
这个题目其实挺巧妙的。最坏情况下要再加几次询问才能确定每头牛的rank。 首先我们考虑最坏情况下要多少条有向边才能确定一个图的顶点的排序。答案是n*(n-1)/2. 这个简单说明一下,首先找一个点向所有其他的点连接一条边,这样仅仅确定了一个顶点是最高等级,去掉该点。然后重复该过程。到确定所有顶点排位的时候就用了上述的边数。 那么现在就很容易了。依原创 2013-04-18 23:28:15 · 1156 阅读 · 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 · 597 阅读 · 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 · 481 阅读 · 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 · 557 阅读 · 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 · 622 阅读 · 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 · 493 阅读 · 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 · 562 阅读 · 0 评论 -
hdu 4081 最小生成树变形
题目意思是给你一个完全图,每个点有一个权值。求一棵生成树。你可以使其中一条边权值变成0.使得该边两点的权值和除以生成树的边劝和最小。思路: 具有最优解的树一定有这么一个性质。除了权值变成0的边外,其余的边都必须是最小生成树的边。 基于这点,我们就可以先求出最小生成树,然后枚举的删边。删了一条边之后就变成了两个独立集, 而我们要在这两个集合中找一条边,使得它具有最优解。注原创 2013-04-14 19:39:50 · 604 阅读 · 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 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 · 599 阅读 · 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 · 586 阅读 · 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 评论 -
hdu Holiday's Accommodation dfs
#include #include #include #include #define ll long long#pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std;const int maxn=1e5+9;vector > e[maxn];int n;int son[maxn]原创 2013-11-24 02:39:45 · 1059 阅读 · 0 评论