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 < ...
随机推荐
- jenkins未授权访问漏洞
jenkins未授权访问漏洞 一.漏洞描述 未授权访问管理控制台,可以通过脚本命令行执行系统命令.通过该漏洞,可以后台管理服务,通过脚本命令行功能执行系统命令,如反弹shell,wget写webshe ...
- Mysql的行级锁与表级锁
在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎).表级锁(MYISAM ...
- Hibernate 框架
首先,我们先来了解一下什么是 Hibernate 框架. 什么是 Hibernate 框架? Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO ...
- sharding demo 读写分离 U (分库分表 & 不分库只分表)
application-sharding.yml sharding: jdbc: datasource: names: ds0,ds1,dsx,dsy ds0: type: com.zaxxer.hi ...
- 解决跨域session 同步问题
跨域来源:(前端站点和后端API布署到不同的站点) 解决方案 一.服务端设置 1.配置允许跨域请求 public class BaseAction { /** * 支持跨域请求 * @author f ...
- 关于asp.net调用gemalto超级狗api的具体实现
鉴于网上关于超级狗的具体操作并不详细,我把我所知道的写下来,希望能给有需求的网友做个参考.软件外壳保护我就不说了,没有什么难度,供应商也会提供文档,一步一步操作即可.我要说的是用于保护发给客户的程序, ...
- 微信公众号发送消息给用户 php
1.微信公众号 这里得话 一开始先去看了 微信公众号的接口 发现网页授权需要时认证的服务号,一开始想的是那去申请一个认证的服务号岂不是很费事,然后网上搜了搜,发现了还有微信公众号个人测试号这个东西,所 ...
- Eclipse+CXF框架开发Web服务实战
一. 说明 采用CXF框架开发webservice. 所用软件及版本如下. 操作系统:Window XP SP3. JDK:JDK1.6.0_07,http://www.oracle.com/ ...
- nginx在线与离线安装
1.场景描述 项目要部署到新的服务器上,需要安装nginx,刚好安全部门通知了nginx存在安全漏洞(Nginx整数溢出漏洞,nginx1.13.2之后的版本无问题),就下载最新的nginx进行了安装 ...
- Zookeeper_阅读源码第一步_在 IDE 里启动 zkServer(集群版)
上篇文章Zookeeper_阅读源码第一步_在 IDE 里启动 zkServer(单机版)讲了在 idea 里以单机的方式启动zookeeper,这篇介绍一下以集群的方式启动. 集群方式启动,才会真正 ...