zoj3261 带权并查集
题意:有很多颗星球,各自有武力值,星球间有一些联系通道,现在发生战争,有一些联系通道会被摧毁,而一些星球会通过还没有被摧毁的联系通道直接或者间接联系能够联系到的武力值最高的星球求救,如果有多个武力值都为最高的,那就联系一个编号最小的。现在给出一系列求救和摧毁的序列,一次执行,并对于每一个求救指令寻找合适的求救星球编号,如果没有可以求救的则输出 -1;
由于一般并查集只能够合并集合而不能将集合拆离,因此可以离线之后反向执行,这样集合的拆离就变成了集合的合并。
只要先保存所有的边和询问,然后对于所有的摧毁联系用建边的方式记录,然后扫一遍一开始的联系通道关系,除了将会被摧毁的边不动外,将剩下的联系通道用并查集的方式建立起来。
由于需要查找的值是武力值最大并且编号最小的,所以可以在合并并查集的时候根据武力值大小,将武力值小的那个节点的父亲设置为祖先大的,如果需要合并的两个节点的武力值是相等的,那么把编号大的节点的父亲设置为编号小的节点,这样在查询祖先的时候就一定查到武力值最大并且编号最小的节点了。
然后对于所有命令序列反向处理,从最后一条开始,查询就直接输出结果,如果查到的祖先节点是它自己就输出 -1,如果是摧毁通道那就建立这两点之间的通道就行了。
#include<stdio.h>
#include<string.h> int fa[],n,a[],ans[];
int l1[],l2[],y[],z[];
bool x[];
int head[],nxt[],point[],size;
char s[]; void add(int a,int b){
point[size]=b;
nxt[size]=head[a];
head[a]=size++;
point[size]=a;
nxt[size]=head[b];
head[b]=size++;
} int mmax(int a,int b){
return a>b?a:b;
} void init(){
for(int i=;i<n;i++)fa[i]=i;
} int find(int x){
int r=x,t;
while(r!=fa[r])r=fa[r];
while(x!=r){
t=fa[x];
fa[x]=r;
x=t;
}
return r;
} int main(){
int c=;
while(scanf("%d",&n)!=EOF){
if(c++)printf("\n");
int i,m;
size=;
memset(head,-,sizeof(head));
for(i=;i<n;i++)scanf("%d",&a[i]);
init();
scanf("%d",&m);
for(i=;i<=m;i++)scanf("%d%d",&l1[i],&l2[i]);
int q;
scanf("%d",&q);
for(i=;i<=q;i++){
scanf("%s",s);
if(s[]=='q'){
x[i]=;
scanf("%d",&y[i]);
}
else{
x[i]=;
scanf("%d%d",&y[i],&z[i]);
add(y[i],z[i]);
}
}
int j;
bool f;
for(i=;i<=m;i++){
f=;
for(j=head[l1[i]];~j;j=nxt[j]){
if(point[j]==l2[i]){f=;break;}
}
if(!f)continue;
int x1=find(l1[i]),y1=find(l2[i]);
if(x1!=y1){
if(a[x1]>a[y1])fa[y1]=x1;
else if(a[x1]<a[y1])fa[x1]=y1;
else if(x1<y1)fa[y1]=x1;
else fa[x1]=y1;
}
}
int cnt=;
for(i=q;i>=;i--){
if(x[i]){
int x1=find(y[i]),y1=find(z[i]);
if(x1!=y1){
if(a[x1]>a[y1])fa[y1]=x1;
else if(a[x1]<a[y1])fa[x1]=y1;
else if(x1<y1)fa[y1]=x1;
else fa[x1]=y1;
}
}
else{
int x1=find(y[i]);
ans[++cnt]=a[x1]>a[y[i]]?x1:-;
}
}
for(i=cnt;i>=;i--){
printf("%d\n",ans[i]);
}
}
return ;
}
zoj3261 带权并查集的更多相关文章
- POJ 1703 Find them, Catch them(带权并查集)
传送门 Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 42463 Accep ...
- [NOIP摸你赛]Hzwer的陨石(带权并查集)
题目描述: 经过不懈的努力,Hzwer召唤了很多陨石.已知Hzwer的地图上共有n个区域,且一开始的时候第i个陨石掉在了第i个区域.有电力喷射背包的ndsf很自豪,他认为搬陨石很容易,所以他将一些区域 ...
- poj1417 带权并查集 + 背包 + 记录路径
True Liars Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2713 Accepted: 868 Descrip ...
- poj1984 带权并查集(向量处理)
Navigation Nightmare Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 5939 Accepted: 2 ...
- 【BZOJ-4690】Never Wait For Weights 带权并查集
4690: Never Wait for Weights Time Limit: 15 Sec Memory Limit: 256 MBSubmit: 88 Solved: 41[Submit][ ...
- hdu3038(带权并查集)
题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=3038 题意: n表示有一个长度为n的数组, 接下来有m行形如x, y, d的输入, 表示 ...
- 洛谷OJ P1196 银河英雄传说(带权并查集)
题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山 ...
- poj1984 带权并查集
题意:有多个点,在平面上位于坐标点上,给出一些关系,表示某个点在某个点的正东/西/南/北方向多少距离,然后给出一系列询问,表示在第几个关系给出后询问某两点的曼哈顿距离,或者未知则输出-1. 只要在元素 ...
- poj1611 带权并查集
题意:病毒蔓延,现在有 n 个人,其中 0 号被认为可能感染,然后给出多个社交圈,如果某个社交圈里有人被认为可能被感染,那么所有这个社交圈里的人都被认为可能被感染,现在问有多少人可能被感染. 带权并查 ...
随机推荐
- JAVA每日一记
1.两个最基本的java回收算法:复制算法和标记清理算法 复制算法:两个区域A和B,初始对象在A,继续存活的对象被转移到B.此为新生代最常用的算法 ...
- 10 件在 PHP 7 中不要做的事情
1. 不要使用mysql_函数 这一天终于来了,从此你不仅仅"不应该"使用mysql_函数.PHP 7 已经把它们从核心中全部移除了,也就是说你需要迁移到好得多的mysqli_函数 ...
- SharePoint 2010 BCS - 简单实例(二)外部列表创建
博客地址 http://blog.csdn.net/foxdave 接上篇 由于图片稍多篇幅过长影响阅读,所以分段来写. 添加完数据源之后,我们需要为我们要放到SharePoint上的数据表定义操作, ...
- 破解Xamarin
试用了一阵子Mono For Android,今天到期了,,囊中羞涩,只好破解. 说是要在vs2013的英文界面下运行破解包,不知道是真是假,下载并安装了一个. 然后又下载了破解包.是个名为xa.ra ...
- 《同一个类中不同方法之间的调用相关问题(省略的类名或者this)》
//同一个类中不同方法之间的调用相关问题(省略的类名或者this) class A { public void B() { System.out.println("b方法运行"); ...
- 解决C#的64位打包程序,在64位机器上运行出现BadImageFormatException异常。
转载自:http://msdn.microsoft.com/zh-cn/library/system.badimageformatexception%28v=vs.100%29.aspx BadIma ...
- STL中的lower_bound和upper_bound的理解
STL迭代器表述范围的时候,习惯用[a, b),所以lower_bound表示的是第一个不小于给定元素的位置 upper_bound表示的是第一个大于给定元素的位置. 譬如,值val在容器内的时候,从 ...
- A problem needed to review and fix later
urllib2.URLError:<urlopen error [Errno 110] Connection timed out> still have no idea how to fi ...
- iOS:死锁
死锁:指多个进程因竞争共享资源而造成的一种僵局,若无外力作用,这些进程都将永远不能再向前推进. 安全状态与不安全状态:安全状态指系统能按某个进程顺序来为每个进程分配其所需资源,直至最大需求,使每个进程 ...
- MySQL数据库备份和还原的常用命令小结
备份MySQL数据库的命令 mysqldump -hhostname -uusername -ppassword databasename > backupfile.sql 备份MySQL数据库 ...