题目链接: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(并查集逆向加边)的更多相关文章

  1. 洛谷 P1197 BZOJ 1015 [JSOI2008]星球大战 (ZOJ 3261 Connections in Galaxy War)

    这两道题长得差不多,都有分裂集合的操作,都是先将所有操作离线,然后从最后一步开始倒着模拟,这样一来,分裂就变成合并,也就是从打击以后最终的零散状态,一步步合并,回到最开始所有星球都被连为一个整体的状态 ...

  2. ZOJ 3261 - Connections in Galaxy War ,并查集删边

    In order to strengthen the defense ability, many stars in galaxy allied together and built many bidi ...

  3. 题解报告:zoj 3261 Connections in Galaxy War(离线并查集)

    Description In order to strengthen the defense ability, many stars in galaxy allied together and bui ...

  4. ZOJ 3261 Connections in Galaxy War(逆向并查集)

    参考链接: http://www.cppblog.com/yuan1028/archive/2011/02/13/139990.html http://blog.csdn.net/roney_win/ ...

  5. ZOJ 3261 Connections in Galaxy War (逆向+带权并查集)

    题意:有N个星球,每个星球有自己的武力值.星球之间有M条无向边,连通的两个点可以相互呼叫支援,前提是对方的武力值要大于自己.当武力值最大的伙伴有多个时,选择编号最小的.有Q次操作,destroy为切断 ...

  6. zoj 3261 Connections in Galaxy War

    点击打开链接zoj 3261 思路: 带权并查集 分析: 1 题目说的是有n个星球0~n-1,每个星球都有一个战斗值.n个星球之间有一些联系,并且n个星球之间会有互相伤害 2 根本没有思路的题,看了网 ...

  7. ZOJ-3261 Connections in Galaxy War 并查集 离线操作

    题目链接:https://cn.vjudge.net/problem/ZOJ-3261 题意 有n个星星,之间有m条边 现一边询问与x星连通的最大星的编号,一边拆开一些边 思路 一开始是真不会,甚至想 ...

  8. ZOJ - 3261 Connections in Galaxy War(并查集删边)

    https://cn.vjudge.net/problem/ZOJ-3261 题意 银河系各大星球之间有不同的能量值, 并且他们之间互相有通道连接起来,可以用来传递信息,这样一旦有星球被怪兽攻击,便可 ...

  9. ZOJ3261 Connections in Galaxy War 并查集

    分析:对于这种删边操作,我们通常可以先读进来,然后转化离线进行倒着加边 #include <stdio.h> #include <string.h> #include < ...

随机推荐

  1. spring boot中的声明式事务管理及编程式事务管理

    这几天在做一个功能,具体的情况是这样的: 项目中原有的几个功能模块中有数据上报的功能,现在需要在这几个功能模块的上报之后生成一条消息记录,然后入库,在写个接口供前台来拉取消息记录. 看到这个需求,首先 ...

  2. Python pip包管理器安装第三方库超时解决方案

    一.国内镜像安装 使用方法:pip install --index 镜像网站 第三方库名 二.镜像网站 http://pypi.douban.com/simple/ 豆瓣 http://mirrors ...

  3. jmeter使用JDBC连接数据库

    jmeter使用JDBC的配置元件连接数据库,通过sql语句查询需用到的数据 配置元件名称:JDBC connection configuration,使用前,需导入mysql-connector-j ...

  4. 2、JAVA相关基础的学习和工具

    个人感觉,各种语言的基础知识,例如标识符,运算符等在宏观上几乎是一样的,只是在某些方面上会有一点点差异,因为本人已经有了语言基础,所以对于标识符,关键字,运算符等方面的只是便不作赘述,敬请谅解,如果你 ...

  5. 理解MySQL(一)--MySQL介绍

    一.Mysql逻辑架构: 1. 第一层:服务器层的服务,连接\线程处理. 2. 第二层:查询执行引擎,MySQL的核心服务功能,包括查询解析.分析.优化和缓存,所有跨存储引擎的功能都在这一层实现. 3 ...

  6. Caffeine Cache-高性能Java本地缓存组件

    前面刚说到Guava Cache,他的优点是封装了get,put操作:提供线程安全的缓存操作:提供过期策略:提供回收策略:缓存监控.当缓存的数据超过最大值时,使用LRU算法替换.这一篇我们将要谈到一个 ...

  7. 转载 | embed用法(网站中视频、音频的添加)

    网站中添加视频: <embed src="http://player.video.qiyi.com/390cf6c74450e4c70b7bd2d883169914/0/0/w_19r ...

  8. gRPC【RPC自定义http2.0协议传输】

    gRPC 简介 gRPC是由Google公司开源的高性能RPC框架. gRPC支持多语言 gRPC原生使用C.Java.Go进行了三种实现,而C语言实现的版本进行封装后又支持C++.C#.Node.O ...

  9. 单纯的xlistview

    public class MainActivity extends AppCompatActivity implements XListView.IXListViewListener{ private ...

  10. Unity进阶之:Shader渲染

    版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客&qu ...