
并查集
文章平均质量分 61
Matrix1254
爱代码,爱加班,爱咖啡可乐
爱挑战,爱钻研,爱打游戏
爱晚起,也爱工作到深夜。
我擅长技术,崇尚简单和懒惰
我神秘而孤僻,沉默而爱憎分明
我行我素,我是程序员
展开
-
hdu 1856 More is better (究级版)
简单题,列出最大集合所含元素个数即可。要用带路径压缩的并查集,不然会TLE。另外,要注意当n为0时,要输出1. 题目有说: or there is only one boy left. 可能有100000个男孩,但都没配对,答案是1。AC代码:#includeusing namespace std;#define NUM 10000005int set[NUM];int a原创 2013-02-09 16:28:19 · 447 阅读 · 0 评论 -
hdu 1233 还是畅通工程
题目实质是求最小生成树,用Kruskal算法。一、把原始图的N个节点看成N个独立子图;二、每次选取当前最短的边(前提操作是?),看两端是否属于不同的子图;若是,加入;否则,放弃;三、循环操作该步骤二,直到有N-1条边;AC代码:#include#include#include#define NUM 10005int set[NUM];struct point{原创 2013-02-09 20:43:06 · 554 阅读 · 0 评论 -
hdu 1325 Is It A Tree?
跟小希的迷宫基本一样,只是此题是有向图,要注意:1无环 2 只有一个入度为0的结点(根结点),不存在入度大于1的结点。输入结束条件是两个负数,而不是-1,不然会TLE。1 1 0 0 经证明,无此数据,不论是true或false,都可AC。AC代码:#include#define NUM 100005int set[NUM];int visit[NUM];int lu[NUM];原创 2013-02-08 11:43:23 · 465 阅读 · 0 评论 -
hdu 1232 畅通工程
极简单的水题,求集合个数-1即可。初始化cnt为n,,每当要合并的时候,就把cnt--。最后输出cnt-1。AC代码:#include#define NUM 1005int set[NUM];int n;void init(){ for(int i=0;i<=n;i++){ set[i]=i; }}int find(int x){ in原创 2013-02-09 17:21:59 · 412 阅读 · 0 评论 -
hdu 1213 How Many Tables
简单并查集,求出并查集的个数。一句话:尽信书,不如无书。凡事要自己思考。merge时都是把双方的根结点来merge。里面的函数均是正确的。AC代码:#include#includeint n,m,res;#define NUM 1005int set[NUM];int find(int x){ return set[x];}void merge(int a, int原创 2013-02-07 17:53:40 · 377 阅读 · 0 评论 -
hdu 1272 小希的迷宫
题目实质是判断是否为连通的无回路的图。用简单并查集做,只是要注意以下三点: 1、读入过程中,合并集合的时候,如果,当前读入的两个元素属于同一个集合,那么肯定是No~; 2、不要忘了最后要判断所有的点都要是连通的哦~不能有孤立的;(这个很关键,之前没考虑到这点一直WA) 3、读入只有0 0的时候,要输出Yes。。。有人说要考虑点数是否是边数+1来判断回路,其实是不正确的。1 1 0原创 2013-02-07 22:35:15 · 469 阅读 · 0 评论 -
hdu 1875 畅通工程再续
与之前的畅通工程类似,求最小生成树,只是要剔除不符合条件的边,还要判断是否是连通图(这个磨蹭了很长时间,只要判断加入集合的点数与题目给出的点数是否相等即可)。 #include#include#include#define NUM 103using namespace std;struct point{ int x; int y;}pos[NUM];原创 2013-02-15 18:58:54 · 509 阅读 · 0 评论 -
hdu 1879 继续畅通工程
跟前几题畅通工程类似,求最小生成树。当状态是已修建时,直接merge。值得注意的是得用scanf,用cin会超时。还得用路径压缩的并查集,不然也会TLE。 #include#includeusing namespace std;//20:07#define NUM 102struct points{ int start; int end; int w;原创 2013-02-15 20:28:29 · 450 阅读 · 0 评论 -
hdu 1102 Constructing Roads
跟之前的继续畅通工程几乎一模一样,只是输入换一下。map[i][j]!=0时,才将其做为一条边,否则不加入。#include#includeusing namespace std;#define NUM 105struct points{ int start; int end; int w;}pos[10005];int set[NUM];int原创 2013-02-15 20:54:26 · 408 阅读 · 0 评论