
最小生成树、并查集
文章平均质量分 68
AcDora
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
UVa10034
这道题就是最小生成树的题,给n个点的坐标,求最小生成树第一次wa了,错误很低级,忘记反过来给左下角的元素赋值了代码如下:#include #include #include const int Max = 101;int T, n;double map[Max][Max], x[Max], y[Max];double prim() { double inf, ans =原创 2013-01-25 21:51:30 · 647 阅读 · 0 评论 -
UVa 534 Frogger (最小瓶颈路)
很裸的一道最小瓶颈路的模板题,先求最小生成树,然后在求点对点的最小瓶颈路代码如下:#include #include #include #include using namespace std;const int N = 210;const double INF = 1000000;int n, p[N];double x[N], y[N], map[N][N], f[N原创 2013-02-19 09:36:29 · 2352 阅读 · 0 评论 -
UVa11747 Heavy Cycle Edge (Kruskal)
卡了一道题,想今天怎么都得过一道题,就先拿着开刀吧,比较简单的#include #include #include using namespace std;typedef long long ll;struct edge { int u, v; ll w; bool is;}e[25010];int n, m, fa[1010];bool cmp( e原创 2013-02-25 20:37:14 · 871 阅读 · 0 评论 -
UVa 11710 Expensive subway
很简单的最小生成树问题,主要优点不一样的是,需要用到map代码如下:#include #include #include #include #include using namespace std;const int N = 500;const int INF = 100000000;int n, m, st;int g[N][N], p[N];map mymap;原创 2013-02-26 18:53:56 · 1204 阅读 · 0 评论 -
UVa 908 (RE-connectong computer sites )
这道题很唬人的,题目描述说了那么长,开始还给出了很多不要的输入,但是仔细读题,第二个输出数字,是指M+K条边里面选择几条边,连接,是费用最小,其实就是把之前的费用加起来,然后再在M+K的情况下求一次最小生成树还有,数据很大,数组果断不要用了,只能用vector表示的边表,其中里面还有的数据结构还是结构体稠密图,边最多可达到10的11次幂,虽说,有些网友表示,测试数据其实并没有那么大,但pr原创 2013-03-02 13:50:12 · 995 阅读 · 0 评论 -
HDU 4514 湫湫系列故事——设计风景线 (并查集)
判断有没有环路,我个人认为还是并查集效率要高,而且复杂度要比dfs低,性价比很好这道题的要求,第一判断是否有环,如果没有环,就输出最长的路径我们可以想到一个无向图如果没有环的话,一定就是两种形态,一种是一棵树,另一种就是森林那么要求最长路径的话,也就是要求树的半径大致的思想明白了,就说一下细节吧并查集的思想就是在图中找一个节点作为根,凡是和这点在一个连通分量里面的点,都插入到这原创 2013-03-23 18:46:26 · 1724 阅读 · 3 评论 -
HDU 2121 Ice_Cream's World II (最小树形图)
(还是比较灵异,我代码重写了一遍,就对了,之前不知道哪里错了,一直wa)题目分析出来就是无固定跟的最小树形图。无固定根的话,那就给定一个人工的根!然后复习一下最小树形图的建图流程:1、首先,除了根节点以外,给每个节点找到一个最小入边;然后检查除根节点以外其他节点,如果有孤立的节点的话,说明无解!2、找环,因为只要到达环上的任意一点,那么就可以到达这个环上的其他的所有的点,所以说原创 2013-04-22 22:28:29 · 1079 阅读 · 0 评论 -
HEU Tunnels(常规最小生成树)
注意数据类型,使用double!#include #include #include const int N = 110;struct Node { double x, y;}point[N];int n;double g[N][N];const double INF = 10000000000.0;const double eps = 1e-9;double原创 2013-04-26 21:05:42 · 880 阅读 · 0 评论 -
POJ 1611 The Suspects (并查集)
这道题,就要好好分析题意!并查集我会的,但是并没有第一时间反应出来这是并查集的题目。可见,分析问题的能力有待进一步提升。这个问题是说,只要和疑似病例在一个组的都算是疑似病例,第0号同学默认为疑似病例。那么可分析,只要和0号同学在一组或者和疑似病例在一组的,就是算是疑似病例,那么也就是说,在并查集里面,只要找到根节点是0的,就算是疑似病例。很典型的并查集题目代码:#include原创 2013-04-30 11:34:48 · 797 阅读 · 0 评论 -
UVa 11733 Airports( MST )
先建一棵最小生成树,然后看有几个连通分量,就建几个机场,最后从已选择的边中,将删除所有比建机场贵的边,加上相应的机场数!解题思路要清晰代码:#include #include #include #include using namespace std;const int N = 10010;const int M = 100010;int T, A;int n, m,原创 2013-05-12 22:49:29 · 1748 阅读 · 0 评论 -
UVa 11228 Transpartation System ( kruskal)
这道题本来很简单的,思路也很简单的,第一次wa了,后来才想明白这需要对kruskal有一定的认识思路,正常建最小生成树,然后权值小于r的,就加在ans1上,大于等于r的,就加在ans2上;小于r的边,如果加入树中,那么连通分量减1,设s为连通分量数目,开始等于n具体代码如下:#include #include #include #include using namesp原创 2013-02-19 16:17:01 · 969 阅读 · 0 评论 -
UVa 544 Heavy Cargo( 最小生成树的variant)
这道题,就是最大生成树,以及瓶颈路上的最小权值边代码如下:#include #include #include #include #include #include using namespace std;const int N = 210;const int INF = -1;const int INFB = 100000;int n, r, g[N][N], p[原创 2013-02-19 11:11:58 · 1483 阅读 · 0 评论 -
hdu4009 Transfer water ( 最小树形图的模板 )
题目:一个村庄发洪水,村民要搬到山上去,这就需要把水运上去。获得水资源有两种方式,第一,自己挖井,费用是海拔高度*x;第二,修水道引水,水道的费用是长度*Y,(长度=|x1 - x2|+|y1-y2| +|z1-z2|),另外,如果从比当前海拔低的人家引水,还有加Z这么多的钱,是水泵的费用。求让全村的人都能有水喝的最小费用!如果不能连通,输出-1。分析:第一,由于海拔不同,修水道的费用不同原创 2012-10-23 22:50:05 · 1160 阅读 · 0 评论 -
UVa10397 连接校园(prim)
这是典型的最小生成树的题目,把已有的边权值设为0即可下面是代码:#include #include #include #include using namespace std;const int N = 800;const double inf = 10000000;int n, m;double x[N], y[N], map[N][N];double prim(原创 2013-02-04 14:11:15 · 801 阅读 · 0 评论 -
UVa10158 War(并查集)
这道题是并查集的应用,很好的题型思路我也是参照别人的思路,不过思路很简单的题中说了很多很复杂的关于朋友还是敌人的东西,其实你读透了就会发现,其实就是一句话,如果你是我的朋友的朋友,那么我们就有公共的敌人也就是说这个朋友圈的人, 和敌人圈的人没有交集;但是到底是朋友还是敌人,怎么表示n个人,用2*n个点表示,前n个表示本身,后n个表示相应点的分身,如果是朋友,就把本身加进去,如果原创 2013-02-04 18:17:57 · 990 阅读 · 0 评论 -
UVa10608 Friends
典型的并查集的题目题目:n个人,如果A和B认识,B和C认识,那么A和C就认识,求最大的朋友集合中的人数换句话说,就是求最大的连通分量代码如下:#include const int N = 30005;int fa[N], ans[N], n, m, T;int find( int x ) { return fa[x] == x ? x : fa[x] = find原创 2013-02-04 12:22:13 · 835 阅读 · 0 评论 -
UVa10369北极网络(prim)
这道题求最小生树中第k小的边,很多人用的是kruskal算法,但是由于边很多的,其实我觉得正解应该是prim比较省时那么如果用prim我们怎么去求,那就要明确去一个概念,在实现prim的时候,有一个用于记录的数组,它存放第i个节点到集合(已经被选为最小生成树的点的集合)的最小边的权值,那么不管这个i节点和集合中哪一个点相连,当函数结束的时候,它就是表示i节点到它应当连接的那个节点的边的权值,那原创 2013-02-06 15:39:54 · 754 阅读 · 0 评论 -
UVa 10147 Highways(最小生成树,水)
这道题,wa了,原因是没有需要建路的时候,输出一行提示,我忽视了水题,唯一有点特别的是需要输出新建的边,那么就要建一棵前驱树,用数组表示代码:#include #include #include const int N = 800;const double INF = 10000000000;int T, n, m, num, p[N];double map[N][N],原创 2013-02-17 22:27:10 · 1761 阅读 · 0 评论 -
UVa11631 Dark Roads(最小生成树,邻接表)
很裸的一道求最小生成树的题,只是数据很大,要用邻接表来存储代码:#include #include #include using namespace std;const int N = 200010;const long long INF = 10000000000;int n, m, id, head[N];long long sum;struct edge{原创 2013-02-17 00:48:39 · 846 阅读 · 0 评论 -
UVa 10600 ACM contest and Blackout( 次小生成树)
很裸的模板题求最小生成树,和次小生成树代码:#include #include #include using namespace std;const int N = 110;const int M = 310;const int INF = 100000000;int n, m, map[N][N], p[N], d[N], f[N][N], s1, s2, mark[原创 2013-02-18 21:34:52 · 1141 阅读 · 0 评论 -
UVa 10462 Is There A Second Way Left? (Kruskal,次小生成树)
这道题还是比较有考虑的价值的求:判断是否有最小生成树,次小生成树,如果有次小生成树,则输出次小生成树的总权值要注意的是,点和点之间是有重边的,要求次小生成树,就一定要保留所有重边考虑到即要判断图是不是连通的,又要保存重边,所以Kruskal是首选,prim算法或许有解,但是本人实在是没有想出来怎么样比Kruskal能更加简单,如果大牛经过,求指点次小生成树一定是最小生成树减一条边,原创 2013-02-19 12:47:26 · 2096 阅读 · 1 评论 -
HDU 4081 Qin Shi Huang's National Road System (枚举次小生成树)
#include #include #include #include #include #include #include #include #include using namespace std;#define eps 1e-9const int N = 1010;const int INF = 100000.0;int T, n;double maxcost[N原创 2013-10-14 15:45:06 · 1003 阅读 · 0 评论