NOI2002银河英雄传说——带权并查集
题目:https://www.luogu.org/problemnew/show/P1196
关键点在于存下每个点的位置。
自己糊涂的地方:位置是相对于谁的位置?
因为每次给一个原来是fa的点赋位置时,赋的位置与此点的新fa有关,故很容易想到在 find() fa 时顺便更新 位置 们。
所以每次存的位置应该是新fa的集的大小——不能加上新fa自己的位置,那样就混乱了。
要点在于若想在 find() 更新 fa 时同步更新 pos,则存的位置必须是 相对于自己当前 fa 的位置!
自己的难点:怎样做到递归同步更新pos?
递归的要点是先运行一遍更深层的,则更深层的地方就被赋好了值,就可以更新当前层了。
所以不能按平常写法:return fa[a]=find(fa[a]);而要在 find() 和 return 中间插一个更新pos的语句!
#include<iostream>
#include<cstdio>
using namespace std;
int t,a,b,fa[],pos[],siz[];//pos是相对自己的fa的位置(无自己,有fa),
char c; //只有这样才能更新fa时同步更新pos
int find(int a)
{
if(fa[a]==a)return a;
int k=find(fa[a]);
pos[a]+=pos[fa[a]];
return fa[a]=k;
}
int main()
{
for(int i=;i<=;i++)fa[i]=i,siz[i]=;
scanf("%d",&t);
while(t--)
{
scanf(" %c%d%d",&c,&a,&b);
if(c=='M')
{
int u=find(a);
int v=find(b);
fa[u]=v;
pos[u]=siz[v];
siz[v]+=siz[u];
}
if(c=='C')
{
int u=find(a);
int v=find(b);
if(u!=v)printf("-1\n");
else
{
int k=pos[a]-pos[b];
if(k<)k=-k;
printf("%d\n",k-);
}
}
}
return ;
}
NOI2002银河英雄传说——带权并查集的更多相关文章
- NOI2002银河英雄传说-带权并查集
[NOI2002]银河英雄传说-带权并查集 luogu P1196 题目描述 Description: 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年, ...
- P1196 [NOI2002]银河英雄传说(带权并查集)
这个题的题目背景很是宏大,什么宇宙战舰的都出来了.但细细一看,我们就会发现,这是带权并查集的题目,首先我们还是像之前在并查集中的操作一样,但在这里我们还是应该开数组来维护所要加的权值,两个战舰是否在同 ...
- 洛谷P1196 [NOI2002]银河英雄传说(带权并查集)
题目描述 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶 ...
- [NOI2002] 银河英雄传说 (带权并查集)
题目描述 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶 ...
- luogu 1196 银河英雄传说 带权并查集
带权并查集,其实有点像许多队列问情况的小学奥数 #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i<= ...
- 【luoguP1196】 [NOI2002]银河英雄传说--边带权并查集 ,
题目描述 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶 ...
- 洛谷P1196 银河英雄传说[带权并查集]
题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山 ...
- [NOI 2002] 银河英雄传说 (带权并查集)
题目描述 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶 ...
- 【洛谷】P1196 [NOI2002]银河英雄传说【带权并查集】
P1196 [NOI2002]银河英雄传说 题目描述 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的 ...
随机推荐
- 普通Region中动态设置poplist的值跟着当前区域的某些值动态变化
//控件设置 ID Catergory1 Item Style messageChoice Picklist View Definition Cux.oracle.apps.po.poplist.se ...
- ehcache.xml详解
<?xml version="1.0" encoding="UTF-8"?> <ehcache> <!-- Sets the pa ...
- Oracle外部表的管理和应用
外部表作为oracle的一种表类型,虽然不能像普通库表那么应用方便,但有时在数据迁移或数据加载时,也会带来极大的方便,有时比用sql*loader加载数据来的更为方便,下面就将建立和应用外部表的命令和 ...
- consumer filter
ProtocolFilterWrapper中buildInvokerChain方法把Filter链在一起,调用执行的时候,逐个执行filter,最后执行filter中的invoker. //Proto ...
- UA 列表
设备 系统 浏览器 User-Agent iPhone IOS QQ浏览器 Mozilla/5.0 (iPhone 84; CPU iPhone OS 10_3_3 like Mac OS X) Ap ...
- 013PHP文件处理——filemtime filectime fileatime date_default_timezone_set touch
<?php /** * filemtime filectime fileatime date_default_timezone_set touch */ /*filemtime:获取文件的修改时 ...
- 取TTable 过滤后的记录数
http://bbs.csdn.net/topics/100057274 可以用AstaClientDataSet这个控件,有filterCount这个属性.另外你还可看它的源码,就能写出filter ...
- sping整合redis,以及做mybatis的第三方缓存
一.spring整合redis Redis作为一个时下非常流行的NOSQL语言,不学一下有点过意不去. 背景:学习Redis用到的框架是maven+spring+mybatis(框架如何搭建这边就不叙 ...
- Kaggle新手入门之路(完结)
学完了Coursera上Andrew Ng的Machine Learning后,迫不及待地想去参加一场Kaggle的比赛,却发现从理论到实践的转变实在是太困难了,在此记录学习过程. 一:安装Anaco ...
- HDU 4240
http://acm.hdu.edu.cn/showproblem.php?pid=4240 题意:求最大流和流量最大的一条路径的流量的比值 题解:流量最大的路径的流量在dinic的dfs每次搜到终点 ...