ZOJ 3261 Connections in Galaxy War (逆向+带权并查集)
题意:有N个星球,每个星球有自己的武力值。星球之间有M条无向边,连通的两个点可以相互呼叫支援,前提是对方的武力值要大于自己。当武力值最大的伙伴有多个时,选择编号最小的。有Q次操作,destroy为切断连接两点的边,query为查询某星球能不能向它人呼叫支援。
还是需要离线逆向并查集求解。思路和HDU 4496很相似,但是此处不一定是把所有边都删去,所以需要删边的情况建立出最终的状态。因为N可以到1e4,所以可以用map嵌套map的方式记录过程中被删去的边,最后再根据删除情况建立状态。
在合并时需要维护自己能够申请到的支援的武力最大值,以及其编号。
#include<stdio.h>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<map>
using namespace std;
typedef long long LL;
const int maxn = 2e4+;
const int INF= 0x3f3f3f3f;
struct Edge{
int u,v;
}E[maxn];
struct Query{
int op,a,b;
LL ans;
}p[maxn*];
LL w[maxn];
LL dist[maxn];
int fa[maxn];
int maxid[maxn];
inline int Find(int x) {return fa[x]==x ?x: fa[x]=Find(fa[x]);}
//void init(int N){ for(int i=0;i<N;++i) fa[i]=i,dist[i]=w[i],maxid[i]=i;}
void Union(int a,int b){
a = Find(a),b = Find(b);
if(a!=b){
fa[a] = b;
if(dist[b]<dist[a] || dist[b]==dist[a] && maxid[b]>maxid[a]){
dist[b]=dist[a];
maxid[b]= maxid[a];
}
}
} map<int,map<int,int> > tag; int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int T,N,M,Q,u,v,tmp,K,cas=;
char op[];
int mk = ;
while(scanf("%d",&N)==){
if(mk) printf("\n");
mk = ;
for(int i=;i<N;++i) {
scanf("%lld",&w[i]);
fa[i]=maxid[i]=i;
dist[i]=w[i];
}
tag.clear();
scanf("%d",&M);
for(int i=;i<=M;++i){
scanf("%d%d",&u,&v);
E[i].u =u , E[i].v=v;
}
scanf("%d",&Q);
for(int i=;i<=Q;++i){
scanf("%s%d",op,&p[i].a);
if(op[]=='d') {
p[i].op=;
scanf("%d",&p[i].b);
tag[p[i].a][p[i].b]=tag[p[i].b][p[i].a]=; //被删边的标记
}
else p[i].op = ; //0删边,1查询
}
//因为并不是把边全删完,建立最终状态
for(int i=;i<=M;++i){
if(tag[E[i].u][E[i].v]) continue; //这条边不在
else Union(E[i].u,E[i].v);
} for(int i=Q;i>=;--i){
if(!p[i].op) Union(p[i].a,p[i].b);
else{
u = Find(p[i].a);
if(dist[u]>w[p[i].a]) p[i].ans=maxid[u];
else p[i].ans= -;
}
}
for(int i=;i<=Q;++i){
if(p[i].op) printf("%lld\n",p[i].ans);
}
}
return ;
}
ZOJ 3261 Connections in Galaxy War (逆向+带权并查集)的更多相关文章
- ZOJ 3261 Connections in Galaxy War(逆向并查集)
参考链接: http://www.cppblog.com/yuan1028/archive/2011/02/13/139990.html http://blog.csdn.net/roney_win/ ...
- zoj 3261 Connections in Galaxy War
点击打开链接zoj 3261 思路: 带权并查集 分析: 1 题目说的是有n个星球0~n-1,每个星球都有一个战斗值.n个星球之间有一些联系,并且n个星球之间会有互相伤害 2 根本没有思路的题,看了网 ...
- 洛谷 P1197 BZOJ 1015 [JSOI2008]星球大战 (ZOJ 3261 Connections in Galaxy War)
这两道题长得差不多,都有分裂集合的操作,都是先将所有操作离线,然后从最后一步开始倒着模拟,这样一来,分裂就变成合并,也就是从打击以后最终的零散状态,一步步合并,回到最开始所有星球都被连为一个整体的状态 ...
- zoj 3261 Connections in Galaxy War(并查集逆向加边)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3261 题意:有很多颗星球,各自有武力值,星球间有一些联系通道,现 ...
- ZOJ 3261 - Connections in Galaxy War ,并查集删边
In order to strengthen the defense ability, many stars in galaxy allied together and built many bidi ...
- 题解报告:zoj 3261 Connections in Galaxy War(离线并查集)
Description In order to strengthen the defense ability, many stars in galaxy allied together and bui ...
- ZOJ - 3261 Connections in Galaxy War(并查集删边)
https://cn.vjudge.net/problem/ZOJ-3261 题意 银河系各大星球之间有不同的能量值, 并且他们之间互相有通道连接起来,可以用来传递信息,这样一旦有星球被怪兽攻击,便可 ...
- 洛谷OJ P1196 银河英雄传说(带权并查集)
题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山 ...
- Lightoj1009 Back to Underworld(带权并查集)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Back to Underworld Time Limit:4000MS ...
随机推荐
- pl/sql 实例精解 03
1. 在Pl/sql 中使用 sql 1: /* 2: * 一个 pl/sql 语句块, 只是一个容器, 是表明一个整体的容器, 容器里可以放置多个sql语句 3: */ 4: 5: declar ...
- python - 判断是否为正小数和正整数
判断输入的金额是否为正整数和正小数 def check_float(string): #支付时,输入的金额可能是小数,也可能是整数 s = str(string) if s.count('.') == ...
- mac 干掉Dashboard
打开终端,输入下面的命令: defaults write com.apple.dashboard mcx-disabled -boolean YES 然后再重启一下 Dock,在终端输入 kill ...
- js事件处理函数中return的作用
这里面的return含有一些细节知识: 例如:onClick='return add_onclick()'与 onClick='add_onclick()'的区别 JAVASCRIPT在事件中调用函数 ...
- Lingo (Spring Remoting) : Passing client credentials to the server
http://www.jroller.com/sjivan/entry/lingo_spring_remoting_passing_client Lingo (Spring Remoting) : P ...
- nodepad++ 快捷键加常用操作
常用快捷键 新建文件 Ctrl+N 打开文件 Ctrl+O 保存文件 Ctrl+S 另存为 Ctrl+Alt+S 全部保存 Ctrl+Shift+S 关闭当前文件 Ctrl+W 打印文件 Ctrl+P ...
- 用vector构造自动扩容的二维数组
#include <iostream> #include <string> #include <vector> using namespace std; int m ...
- sql 循环表中记录
=========================================================================循环排序查询数据=================== ...
- dns解决测试微信二级域名访问问题
背景介绍: 1:解决本地不能通过域名访问问题: 2:解决微信设置二级域名且本地iis站点使用非80端口号问题: ps:网站中微信部分在global中设置了重定向,代码已经修改为必须通过“wechat. ...
- dubbo zookeeper报错failed to connect to server , error message is:No route to host
failed to connect to server , error message is:No route to host 转自:http://blog.csdn.net/miaohongyu1/ ...