有木有非常吊

加强

加强版   啊  ,看了都不敢做了   。后来先做了食物链这个我还是看过的。但还是A不掉,没明确神魔意思 。总而言之。大牛的博客是个好东西。我就那么看了一下,还是不懂怎莫办啊,哎,就那样就A掉了。

。。。

。。

今天我们来谈一下这个并查集的删除操作,依据我对大牛的理解啊,这个并查集的删除操作并非把原来的节点删除掉,而是用一个替身替掉,如今的这个点仅仅是用作桥梁的作用,即是没用的,del  ,,,del  ,。。。删除,那些被删掉的就从n開始给他们一个地址,然后即例如以下代码所看到的
比方说如上图。还没有并到5之前,要删除节点4。假设直接把4直接删除掉的话,那么4上的关系所有删除了。1,3就不在一个集合,可是还要他们在一个集合。那么就给4一个虚拟的节点,在接下来把虚拟节点就是1,3的父节点了,可是这样并非正确的,那么就在和5并起来的时候,把它们各自的虚拟节点并上去 。由于初始化的时候他们的虚拟节点也是他们本身。所以它们最后还是并到了一个集合。根节点还是5.有可能也是虚拟的节点。这都不重要,可是1,3的关系没有变。
假如已经变为上面的那个图了。把4删除掉之后。给他一个新的虚拟节点之后。可是他本身还在这边,相当于一个一个桥连接着。仅仅是他的父节点已经变了。可是其它的还在这里面。

也就是说已经成功的把它删除了,他已经属于还有一个集合了

下面是測试数据
5 6
M 0 1
M 1 2
M 1 3
S 1
M 1 2
S 3


#include <stdio.h>
#include <string.h>
#define N 100001
#define M 1000001
int par[N+M+50];
int repplace[N+50];
int flag[N+M];
int ind;
void init(int n )
{
for(int i=0;i<n;i++)
{
par[i]=i;
repplace[i]=i;
}
ind =n;
}
int findset(int n)
{
if(n==par[n])
return n;
else
return par[n]=findset(par[n]);
}
void unite(int n,int m)
{
int pn=findset(n);
int pm=findset(m);
if(pn!=pm)
par[pn]=pm;
}
void Delete(int n)//删除操作。
{
repplace[n]=ind;
par[ind]=ind;
ind++;
}
int main()
{
int a,b;
char s[3];
int x,y;
int cas=0;
while(scanf("%d%d",&a,&b)==2)//我一直纠结为什莫会WA。推断输入的控制条件错了
{
if(a==0&&b==0)
break;
init(a);
for(int i=0;i<b;i++)
{
scanf("%s",s);
if(s[0]=='M')
{
scanf("%d%d",&x,&y);
unite(repplace[x],repplace[y]);
}
else
{
scanf("%d",&x);
Delete(x);
}
}
memset(flag,0,sizeof(flag));
int ans=0;
for(int i=0;i<a;i++)//推断他们有几个集合
{
int hh=findset(repplace[i]);
if(!flag[hh])
{
flag[hh]=1;
ans++;
}
}
printf("Case #%d: %d\n",++cas,ans);
}
}

其他就不做介绍了,仅仅要会并查集的一般能看懂看懂。看不懂可评论。或发私信。。。

。。


Hdu 2473(并查集删除操作) Junk-Mail Filter的更多相关文章

  1. HDU2473 Junk-Mail Filter - 并查集删除操作(虚父节点)

    传送门 题意: 每次合并两份邮件,或者将某一份邮件独立出来,问最后有多少个邮件集合. 分析: 考虑初始化每个节点的祖先为一个虚父节点(i + n),虚父节点指向它自己.这样可以进行正常的合并操作. 而 ...

  2. hdu 2473 并查集

    思路:每次合并时,都是给一个虚拟的根. #include<map> #include<Set> #include<cmath> #include<queue& ...

  3. hdu 2473 并差集的删除操作

    虚拟数组 待定/.#include<iostream> #include<algorithm> #include<set> using namespace std; ...

  4. hdu 4514 并查集+树形dp

    湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tot ...

  5. HDU 3926 并查集 图同构简单判断 STL

    给出两个图,问你是不是同构的... 直接通过并查集建图,暴力用SET判断下子节点个数就行了. /** @Date : 2017-09-22 16:13:42 * @FileName: HDU 3926 ...

  6. HDU 4496 并查集 逆向思维

    给你n个点m条边,保证已经是个连通图,问每次按顺序去掉给定的一条边,当前的连通块数量. 与其正过来思考当前这边会不会是桥,不如倒过来在n个点即n个连通块下建图,检查其连通性,就能知道个数了 /** @ ...

  7. HDU 2473 Junk-Mail Filter 并查集删除(FZU 2155盟国)

    http://acm.hdu.edu.cn/showproblem.php?pid=2473 http://acm.fzu.edu.cn/problem.php?pid=2155 题目大意: 编号0~ ...

  8. HDU 2473 Junk-Mail Filter 【并查集删除】

    Junk-Mail Filter Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  9. hdu2473 Junk-Mail Filter 并查集+删除节点+路径压缩

    Description Recognizing junk mails is a tough task. The method used here consists of two steps:  1) ...

随机推荐

  1. 乱序双发射 和 GHB的分支预测

    乱序执行(out-of-order execution)是指CPU采用了允许将多条指令不按程序规定的顺序分开发送给各相应电路单元处理的技术.比方Core乱序执行引擎说程序某一段有7 条指令,此时CPU ...

  2. C#中的OLEDB连接2

    在通过ADO对Excel对象进行连接时(此时Excel则认为是一个数据源),需要配置对Excel数据源对应的连接串,这个连接串中包括了Provider信息(其实类似对数据库进行连接操作时,都需要指定连 ...

  3. 【HDOJ】1542 Atlantis

    离散化+线段树+扫描线,求覆盖面积. /* 1542 */ #include <iostream> #include <string> #include <map> ...

  4. Standard Attachments in Oracle Form 标准附件

    Standard Attachments in Oracle Form 默认情况下"附件"按钮是灰色的,本文将展示如何让某个Form的附件按钮变亮,并能上传附件. 以用户Form为 ...

  5. 利用逻辑运算符?"三个数字比大小

    static void Main(string[] args)        {            int a, b, c;            while (true)            ...

  6. 6个可以隐藏运行bat,浏览器等程序的方法

    在电脑启动时或者设置时间时运行指定的程序很容易实现.但是有时候还需要运行时不显示主界面,隐藏到后台运行.比如:开机时一段Bat批处理执行删除默认共享; 开机自动运行浏览器隐藏到后代打开指定网页等,希望 ...

  7. 创建通用型framework

    http://years.im/Home/Article/detail/id/52.html http://www.cocoachina.com/industry/20131204/7468.html ...

  8. linux下passwd命令设置修改用户密码

    1.passwd 简单说明: 我们已经学会如何添加用户了,所以我们还要学习设置或修改用户的密码:passwd命令的用法也很多,我们只选如下的几个参数加以说明:想了解更多,请参考man passwd或p ...

  9. HDU 5651 xiaoxin juju needs help 水题一发

    分析:求一下组合数 首先,如果不止一个字符出现的次数为奇数,则结果为0. 否则,我们把每个字符出现次数除2,也就是考虑一半的情况. 那么结果就是这个可重复集合的排列数了. fact(n)/fact(a ...

  10. 荷兰国旗,三类数字分离 nyoj

    很有用O(n)内实现三类数字分离,以前大多是分成两类数据,快排中分成两类,还有就是"ab***vvvc" 在O(n)中变成 abvvc****,变成两类划分问题   #includ ...