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 < ...
随机推荐
- golang-http 请求---设置header与直接发
背景 现在各种软件到处都是,写代码难免有时候需要http 调用其他的接口. 其实这个东西还挺常用,虽然很简单,但是写的时候 又忘,就像是提笔忘字,索性总结一下吧. 不需要设置header属性的http ...
- Spring Boot简单环境搭建
#### 一.创建一个简单的Maven项目 使用`Maven`,通过导入`Spring Boot`的`starter`模块,可以将许多程序依赖的包自动导入到工程中.使用`Maven`的`parent ...
- pod指定node运行
1.给node打上label kubectl label nodes cn-hongkong.i-j6c5pm0b59y9kaos565o apptype=monitoring 2.查看结果kubec ...
- React 如何搭建脚手架
React 如何搭建脚手架 npm install -g create-react-app //安装 create-react-app react-demo // react-demo ...
- Kafka集群模式安装(二)
我们来安装Kafka的集群模式,三台机器: 192.168.131.128 192.168.131.130 192.168.131.131 Kafka集群需要依赖zookeeper,所以需要先安装好z ...
- 剑指offer-链表
1. 链表中环的入口节点 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 思路一:用哈希表存已经遍历过的节点,O(1)复杂度查找,如果再次遇到就是环入口 # -*- cod ...
- hadoop hdfs 分布式存储
1.克隆前的工作 1.配置好网络nat 需要设置静态ip并能通过主机上网 ssh 和 rsync 是必须下载的 2.yum install vim wget rsync ssh 并配 ...
- 使用selenium进行爬取掘金前端小册的数据
Selenium 简介 百度百科介绍: Selenium [1] 是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE(7, 8, ...
- laravel新项目报错 No application encryption key has been specified.
解决办法, 若文件根目录下没有 .env 1..env.example 改名使用命令 copy 修改为 .env 2.使用命令 php artisan key:generate 获取密码,自动保存到 ...
- golang学习(1)---快速hello world
很多著名的计算机语言都是一两个人在业余时间捣鼓出来的,但是Go语言是由Google的团队打造的.可能一些基础的知识点我不会细讲,因为这个时代你真的得快速学习,才能适应发展. 来看看go的hello, ...