随笔分类 -  ACM解题报告

hdu2473 Junk-Mail Filter 并查集的删除
摘要:本题考查的是并查集的删除.在删除结点的时候要注意这样的问题: 并查集的结构是一棵树,当把某一个结点删去(将其父结点置为自己)时,它的子结点的根就会丢失.因此,在删除某结点的时候,要确定它的所有子结点都已经并到根上了.解决方法: 为每一个结点加一个虚根,这样每个结点都是叶子结点.插入结点时,把它们都并到虚根的集合中.删除结点时,只要把它的父结点置为一个无用的虚根http://blog.csdn.net/a181551981/article/details/6286007#include <iostream> #include <string> using namespac 阅读全文

posted @ 2012-01-25 11:28 windmissing 阅读(170) 评论(0) 推荐(0)

HDU3461 Code Lock 并查集应用
摘要:/*这题程序不难,关键想法比较难,以下内容来自别人的空间如果没有区间存在,答案是26^n,每增加一个区间,n-1(因为这个区间可以变成26种状态~).但是要注意的是,比如已经有(1,10)和(1,3)在了,此时再增加(4,10)就没有作用了使用并查集对于[l,r]我们将l,r+1两个点并起,如果新线段的两个点是同一个集合,就不用减了*/#include <iostream>#include "UFS.h"#include <cmath>using namespace std;int mod = 1000000007;int exp(int a, in 阅读全文

posted @ 2012-01-20 09:38 windmissing 阅读(125) 评论(0) 推荐(0)

HDU1325 Is It A Tree?
摘要:/*不能算是并查集,只是用了路径压缩和树的特点,和1272的区别在于它是有向图,它的父结点是固定的*/#include <iostream>using namespace std;int main(){ int n,m,k=0,s[100005]={0},j=0,i,big; bool f=0; bool flag[100005]={0}; while(cin>>n>>m) { if(m==-1&&n==-1)return 0; if(m==0&&n==0) { k++; int... 阅读全文

posted @ 2012-01-18 19:24 windmissing 阅读(109) 评论(0) 推荐(0)

HDU1272 小希的迷宫 并查集
摘要:/*并查集的应用,注意点的个数为0的时候,注意输入*/#include <iostream>#include "UFS.h"using namespace std;UFS ufs;bool flag[MAXN]={0}, f;int cnt_e, cnt_v;void init();int main(){ int n,m; init(); while(cin>>n>>m) { if(m==-1&&n==-1)return 0; if(m==0&&n==0) { getchar();getchar(); /* 阅读全文

posted @ 2012-01-18 18:04 windmissing 阅读(99) 评论(0) 推荐(0)

HDU1829 A Bug's Life 并查集
摘要:/*HDU1829A Bug's Life 并查集的应用这题不是判断是否在同一集合,而是判断是否在不同的集合*/#include <iostream>#include "UFS.h"using namespace std;int oppo[MAXN];//记录系第一个BUG的异性所在的集合的编号int main(){ int t; int n,m,i,j; UFS ufs; scanf("%d",&t); for(j=1;j<=t;j++) { bool f=0; memset(oppo, 0, sizeof(oppo) 阅读全文

posted @ 2012-01-18 15:49 windmissing 阅读(114) 评论(0) 推荐(0)