随笔分类 -  并查集

一种处理从属关系的结构体系,便于系统的存储这些关系。
摘要:题意:给定一个无向图,首先判定是否成环,然后求一条最长链。分析:成环用并查集,最长链就是个最简单的树形dp了。#include #include #include #include #include #pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;const int N = 100005;int n, m, ans;int set[N];int dp[N];struct Edge { int v, f; Edge() {} Edge(int _v, int _f) : v( 阅读全文
posted @ 2013-10-04 19:29 沐阳 阅读(1234) 评论(0) 推荐(0) 编辑
摘要:该题就是考的是如何花最小的代价使得一棵树划分开且不含后同类节点。我们将边按从大到小的顺序排好序,然后就是看是否这条边能够使得两个同类的节点连在一起,如果能够的话,那么这条边就是我们要选择的划分边。首先将特征值保留起来,并通过并查集扩充给标记点。代码如下:#include <cstring>#include <cstdlib>#include <cstdio>#include <map>#include <algorithm>using namespace std;int N, M, set[100005], have[100005]; 阅读全文
posted @ 2012-07-27 02:37 沐阳 阅读(525) 评论(0) 推荐(0) 编辑
摘要:这题一个地方没注意,导致错了很多次,之后还一直没找到错误。出问题的地方就是在第一轮找入度为零的节点的时候直接找的祖先节点,导致祖先节点多次入队~~~代码如下:#include <cstring>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cmath>#include <queue>using namespace std;int N, M, set[10005], pos, cc;int rec[10005][2];char r[10005 阅读全文
posted @ 2012-07-02 10:41 沐阳 阅读(408) 评论(0) 推荐(0) 编辑
摘要:该题题义是某个人从S点出发,去寻找所有的A,他可以直接到达每个A,也可以通过分身来到达,具体视那种方法所走的路程短而定。换句话说就是可以从A点再走到A点来寻找下一个A,而不选择再从S出发。首先将任意两点之间(A或者S)的距离求出来(通过BFS)然后再建立最小生成树即可。注意输入数据中x,y后面不只一个空格。代码如下:#include <cstring>#include <cstdlib>#include <cstdio>#include <cmath>#include <algorithm>#include <queue> 阅读全文
posted @ 2012-07-01 21:50 沐阳 阅读(204) 评论(0) 推荐(0) 编辑
摘要:最直接的最小生成树,不解释了。代码如下:#include <cstring>#include <cstdlib>#include <cstdio>#include <algorithm>using namespace std;int N, pos, set[105];struct Node{ int x, y, dist; bool operator < (Node t) const { return dist < t.dist; }}e[10005];int find(int x){ return set[x] = x == set 阅读全文
posted @ 2012-07-01 17:52 沐阳 阅读(255) 评论(0) 推荐(0) 编辑
摘要:一道简单的最小生成数,求使得所有的路连通的最小总路程代价中的最长的子路的长度。代码如下:#include <cstring>#include <cstdlib>#include <cstdio>#include <algorithm>using namespace std;int N, pos, set[505];struct Node{ int x, y, dist; bool operator < (Node t) const { return dist < t.dist; }}e[250005];int find(int x){ 阅读全文
posted @ 2012-07-01 17:47 沐阳 阅读(198) 评论(0) 推荐(0) 编辑
摘要:计算整个汽车演化过程中所要改变的最少的字符数。改变的字符数的计算方式为1-7位不同位的个数。代码如下:#include <cstdlib>#include <cstring>#include <algorithm>#include <cstdio>using namespace std;int N, pos, set[2005];char s[2005][10];struct Node{ int x, y, diff; bool operator < (Node t) const { return diff < t.diff; }}e 阅读全文
posted @ 2012-07-01 17:37 沐阳 阅读(187) 评论(0) 推荐(0) 编辑
摘要:该题为简单的并查集应用,只要按要求把给定的关系合并起来,并在合并时遴选出最佳个数即可。 代码如下:#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>using namespace std;int set[100005];int cnt[100005];int max;inline int find( int x ){ return set[x]= x == set[x]? x: find( set[x] );}inline void merge( int x, 阅读全文
posted @ 2011-08-17 22:07 沐阳 阅读(323) 评论(0) 推荐(0) 编辑
摘要:朴素的并查集应用,读题表示很不爽。。。题目讲有至多26个村落,每个村落有多条到其他村落的路,求出连通这些村落的最小代价。代码如下:#include <stdio.h>#include <stdlib.h>struct E{ int x, y, dis;} e[10000];int set[30];int find( int x ){ return set[x]= x== set[x]? x: find( set[x] );}void merge( int a, int b ){ int x= find( a ), y= find( b ); set[x]= y;}int 阅读全文
posted @ 2011-07-21 09:52 沐阳 阅读(275) 评论(0) 推荐(0) 编辑
摘要:Farm Irrigation Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1574Accepted Submission(s): 704Problem DescriptionBenny has a spacious farm land to irrigate. The farm land is a rectangle, and is divided into a lot of samll squares. Water pipes are 阅读全文
posted @ 2011-07-19 17:00 沐阳 阅读(572) 评论(0) 推荐(0) 编辑
摘要:该题的难点在于如何去处理掉等号,这里要用到并查集来处理相同的点,不要在输入的时候处理数据,一定要先将数据全部读取完再处理,这是因为相等的点的出现是不可预见的,很可能不能把相等的点的信息全部加到一个点的邻接表上去。这里说明两条定理:*如果一次入队入度为零的点大于1则说明拓扑排序序列不唯一*如果排序的总个数小于给定的个数,则说明存在回路这两种情况就对应了不同的错误,前者则是信息不完全,后者则是冲突。当然信息不完全不能够说明它不冲突。代码如下:#include <stdio.h>#include <string.h>#include <stdlib.h>#defi 阅读全文
posted @ 2011-07-18 10:04 沐阳 阅读(342) 评论(0) 推荐(0) 编辑
摘要:判定是否成环,是否只有一个根,是否为空.代码如下:#include <cstdlib>#include <cstdio>#include <cstring>#include <algorithm>#include <map>#define MAXN 100000using namespace std;int stk[MAXN+5], top, flag;int set[MAXN+5];map<int,int>mp;void init(){ for (int i = 1; i <= MAXN; ++i) set[i] 阅读全文
posted @ 2011-05-11 22:27 沐阳 阅读(712) 评论(1) 推荐(0) 编辑

点击右上角即可分享
微信分享提示