zoj 3261 Connections in Galaxy War(并查集逆向加边)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3261
题意:有很多颗星球,各自有武力值,星球间有一些联系通道,现在发生战争,有一些联系通道会被摧毁,而一些星球会通过还没有被摧毁的联系通道直接或者间接联系能够联系到的武力值最高的星球求救,如果有多个武力值都为最高的,那就联系一个编号最小的。现在给出一系列求救和摧毁的序列,一次执行,并对于每一个求救指令寻找合适的求救星球编号,如果没有可以求救的则输出 -1
这是一道启发题,有时候正这困难倒着反倒简单。
怎么说,链接好然后断开链接并不是简简单单就能实现的要么复杂度巨高要么就是不存在的。
所以还不如直接要断开的直接都不连,倒着来遇到要断开的位置再连上,这样就是简单的并查集了
#include <iostream>
#include <cstring>
#include <cstdio>
#include <map>
using namespace std;
const int M = 5e4 + 10;
int n , m , q , val[M] , f[M] , pos[M] , num[M] , ans[M];
struct TnT {
int x , y , z;
}T[M] , node[M];
bool vis[M];
map<int , int>mmp[M];
int find(int x) {
if(x == f[x])
return x;
return f[x] = find(f[x]);
}
void Union(int x , int y) {
int a = find(x) , b = find(y);
if(a != b) {
f[a] = b;
if(num[b] < num[a]) {
num[b] = num[a];
pos[b] = pos[a];
}
else if(num[b] == num[a]) {
if(pos[a] < pos[b]) {
pos[b] = pos[a];
}
}
}
}
int main() {
int u , v;
bool first = true;
char cp[20];
while(scanf("%d" , &n) != EOF) {
if(first)
first = false;
else
printf("\n");
for(int i = 0 ; i < n ; i++) {
scanf("%d" , &val[i]);
f[i] = i , pos[i] = i , num[i] = val[i];
mmp[i].clear();
}
scanf("%d" , &m);
for(int i = 1 ; i <= m ; i++) {
scanf("%d%d" , &u , &v);
if(u > v) {
int tmp = u;
u = v;
v = tmp;
}
T[i].x = u;
T[i].y = v;
mmp[u][v] = i;
vis[i] = false;
}
scanf("%d" , &q);
for(int i = 1 ; i <= q ; i++) {
scanf("%s" , cp);
if(cp[0] == 'q') {
scanf("%d" , &node[i].x);
node[i].z = 1;
}
else {
scanf("%d%d" , &u , &v);
node[i].z = 2;
if(u > v) {
int tmp = u;
u = v;
v = tmp;
}
node[i].x = u , node[i].y = v;
vis[mmp[u][v]] = true;
}
}
for(int i = 1 ; i <= m ; i++) {
if(!vis[i]) {
Union(T[i].x , T[i].y);
}
}
int cnt = 0;
for(int i = q ; i >= 1 ; i--) {
if(node[i].z == 1) {
int g = node[i].x;
int end = find(g);
if(num[end] > val[g])
ans[cnt++] = pos[end];
else
ans[cnt++] = -1;
}
else {
Union(node[i].x , node[i].y);
}
}
for(int i = cnt - 1 ; i >= 0 ; i--) {
printf("%d\n" , ans[i]);
}
}
return 0;
}
zoj 3261 Connections in Galaxy War(并查集逆向加边)的更多相关文章
- 洛谷 P1197 BZOJ 1015 [JSOI2008]星球大战 (ZOJ 3261 Connections in Galaxy War)
这两道题长得差不多,都有分裂集合的操作,都是先将所有操作离线,然后从最后一步开始倒着模拟,这样一来,分裂就变成合并,也就是从打击以后最终的零散状态,一步步合并,回到最开始所有星球都被连为一个整体的状态 ...
- 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(逆向并查集)
参考链接: http://www.cppblog.com/yuan1028/archive/2011/02/13/139990.html http://blog.csdn.net/roney_win/ ...
- ZOJ 3261 Connections in Galaxy War (逆向+带权并查集)
题意:有N个星球,每个星球有自己的武力值.星球之间有M条无向边,连通的两个点可以相互呼叫支援,前提是对方的武力值要大于自己.当武力值最大的伙伴有多个时,选择编号最小的.有Q次操作,destroy为切断 ...
- zoj 3261 Connections in Galaxy War
点击打开链接zoj 3261 思路: 带权并查集 分析: 1 题目说的是有n个星球0~n-1,每个星球都有一个战斗值.n个星球之间有一些联系,并且n个星球之间会有互相伤害 2 根本没有思路的题,看了网 ...
- ZOJ-3261 Connections in Galaxy War 并查集 离线操作
题目链接:https://cn.vjudge.net/problem/ZOJ-3261 题意 有n个星星,之间有m条边 现一边询问与x星连通的最大星的编号,一边拆开一些边 思路 一开始是真不会,甚至想 ...
- ZOJ - 3261 Connections in Galaxy War(并查集删边)
https://cn.vjudge.net/problem/ZOJ-3261 题意 银河系各大星球之间有不同的能量值, 并且他们之间互相有通道连接起来,可以用来传递信息,这样一旦有星球被怪兽攻击,便可 ...
- ZOJ3261 Connections in Galaxy War 并查集
分析:对于这种删边操作,我们通常可以先读进来,然后转化离线进行倒着加边 #include <stdio.h> #include <string.h> #include < ...
随机推荐
- Python实现批量处理扫描特定目录
## 简述在渗透测试中遇到相同CMS站点时,搞定一个站点,相当于拿了一个站群的通用漏洞,所以我们首先需要标注站点的CMS类型,根据要求编写如下脚本 ## 要求1.访问特定目录,如:站点特定 /cmsa ...
- Git应用之eclipse解决冲突代码
最近上班公司框架换成了微服务下面是eclipse 对代码进行管理 1.冲突代码 如果两个人在一个项目上同一文件上更改代码就会出现冲突现象 先用NewFile.jsp 文件做演示 打开eclipse从 ...
- 夯实Java基础(七)——Static关键字
1.static介绍 static关键字一直是各大企业中面试常常会问到的问题,主要考察面试者的基础是否扎实,下面来介绍一下static关键字. Java中static表示“全局”或者“静态”的意思,可 ...
- ssm 搭建项目各项配置
首先配置 pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&quo ...
- 深入剖析 RabbitMQ —— Spring 框架下实现 AMQP 高级消息队列协议
前言 消息队列在现今数据量超大,并发量超高的系统中是十分常用的.本文将会对现时最常用到的几款消息队列框架 ActiveMQ.RabbitMQ.Kafka 进行分析对比.详细介绍 RabbitMQ 在 ...
- Python 之父的解析器系列之三:生成一个 PEG 解析器
原题 | Generating a PEG Parser 作者 | Guido van Rossum(Python之父) 译者 | 豌豆花下猫("Python猫"公众号作者) 声明 ...
- mybatis的一对多双向映射
连表查询 select id resultType resultMap resultType和resultMap不能同时使用 association 属性 映射到多对一中的“一”方的“复杂类型”属性, ...
- SSM框架的详细解说
文章转载自:http://blog.csdn.net/zhshulin 使用SSM(Spring.SpringMVC和Mybatis)已经有三个多月了,项目在技术上已经没有什么难点了,基于现有的技术就 ...
- Mock Server的搭建
一.概述 我们系统与第三方开票系统有交互,场景是我们系统请求第三方开票系统,第三方开票系统根据我们的请求数据,生成开票信息然后返回发票号或异常信息,我们根据返回的信息做对应的处理.因为配合上存在一些障 ...
- Python入门基础(10)_异常_1
最近有点忙,到现在快一个月没写了,罪过罪过,继续学习 异常:python程序在运行时,如果python解释器遇到一个错误,那么程序就会停止执行,并且会提示一些错误信息,这就是异常. 抛出异常:程序停止 ...