题目链接: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. Hibernate 框架

    首先,我们先来了解一下什么是 Hibernate 框架. 什么是 Hibernate 框架? Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO ...

  2. 4如何用PHP给MySQL数据库添加记录

    首先连接数据库(依旧用第二篇的方法) 假设数据库表里只有id,name,email三列 添加以下代码 $inputemail=写你要的email;$inputname=写你要的name;//先设定你要 ...

  3. JAVA基础知识(三):input.nextLine() 和input.next()

    next()方法在读取内容时,会过滤掉有效字符前面的无效字符,对输入有效字符之前遇到的空格键.Tab键或Enter键等结束符,next()方法会自动将其过滤掉:只有在读取到有效字符之后,next()方 ...

  4. Unity工程无代码化

     目的 Unity默认是将代码放入工程,这样容易带来一些问题.1. 代码和资源混合,职能之间容易互相误改.2. 当代码量膨胀到一定程度后,代码的编译时间长到无法忍受.新版的unity支持通过asmde ...

  5. node 删除和复制文件或文件夹

    [toc] 创建时间:2019-08-12 注意:在win10,v10.16.1 环境运行无问题 首先引入相关包(会在使用处具体说明): const fs = require('fs') const ...

  6. android ——后台下载

    这次的这个demo想要实现一个后台下载文件的功能,下载的时候会有一个告知进度的通知, 使用的依赖库就一个: compile 'com.squareup.okhttp3:okhttp:3.9.0' 大体 ...

  7. pikachu

    题目链接:http://127.0.0.1/pikachu-master/vul/sqli/sqli_id.php 题目来源:pikachu-->SQL-inject-->数字型注入(po ...

  8. 洛谷 P2158 [SDOI2008]仪仗队

    题意简述 给定一个n,求gcd(x, y) = 1(x, y <= n)的(x, y)个数 题解思路 欧拉函数, 则gcd(x, y) = 1(x <= y <= n)的个数 ans ...

  9. 数据库系统原理之SQL(三)

    数据库系统原理之SQL(三) 1. SQL的组成 1. 数据查询 2. 数据定义 3. 数据操作 4. 数据控制 2. 数据定义语言 CREATE创建数据库或数据库对象 创建数据库 ~~~ CREAT ...

  10. 性能测试学习第五天-----Jmeter测试脚本&基础元件使用

    JMeter简介:一个100%的纯Java桌面应用,由Apache组织的开放源代码项目,它是功能和性能测试的工具.具有高可扩展性.支持Web(HTTP/HTTPS).SOAP.FTP.JAVA等多种协 ...