zoj 3261 Connections in Galaxy War

点击打开链接zoj 3261

思路: 带权并查集
分析:
1 题目说的是有n个星球0~n-1,每个星球都有一个战斗值。n个星球之间有一些联系,并且n个星球之间会有互相伤害
2 根本没有思路的题,看了网上的思路才知道是逆向并查集。如果我们按照正常的并查集来做,以战斗值最大为根节点的话,当询问的时候很容易,但是碰到删除边的时候就很困难了,所以这里才用逆向的并查集思路
3 我们先把所有的输入保存,然后我们可以这么考虑,从后面往前面枚举q次条件,如果是destroy我们认为是加边,这样的话就很好维护并查集了
4 但是这边我们还要考虑初始的状态,由于涉及到删边而且不一定是删除所有的边,所以我们只要在m个关系里面扣除要删除的边,然后建立集合做为初始的状态

代码:

#include<map>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int MAXN = 50010;

struct Node{
    int mark;
    int x;
    int y;
};
Node node[MAXN];
Node edge[MAXN];

int n , m , q;
int val[MAXN];
int father[MAXN];
int ans[MAXN];
map<int , int>mp;

void init(){
    mp.clear();
    for(int i = 0 ; i < n ; i++)
        father[i] = i;
}

int find(int x){
    if(father[x] != x)
        father[x] = find(father[x]);
    return father[x];
}

void Union(int x , int y){
    int fx = find(x);
    int fy = find(y);
    if(fx != fy){
        if(val[fx] > val[fy])
            father[fy] = fx;
        else if(val[fx] < val[fy])
            father[fx] = fy;
        else{
            if(fx < fy)
                father[fy] = fx;
            else
                father[fx] = fy;
        }
    }
}

void solve(){
    for(int i = 0 ; i < m ; i++){
        if(mp[edge[i].x*MAXN+edge[i].y])
            continue;
        Union(edge[i].x , edge[i].y);
    }
    int pos = 0;
    for(int i = q-1 ; i >= 0 ; i--){
        if(node[i].mark == 0){
            int fx = find(node[i].x);
            // 这边不能写成的node[i].x != fx;
            // 因为有可能跟节点和它的值相同
            if(val[node[i].x] >= val[fx])
                ans[pos++] = -1;
            else
                ans[pos++] = fx;
        }
        else
            Union(node[i].x , node[i].y);
    }
    for(int i = pos-1 ; i >= 0 ; i--)
        printf("%d\n" , ans[i]);
}

int main(){
    int x , y;
    char str[10];
    bool first = true;
    while(scanf("%d" , &n) != EOF){
        if(first)
            first = false;
        else
            puts("");
        for(int i = 0 ; i < n ; i++)
            scanf("%d" , &val[i]);
        init();
        scanf("%d" , &m);
        for(int i = 0 ; i < m ; i++){
            scanf("%d%d" , &edge[i].x , &edge[i].y);
            if(edge[i].x > edge[i].y)
                swap(edge[i].x , edge[i].y);
        }
        scanf("%d" , &q);
        for(int i = 0 ; i < q ; i++){
            scanf("%s" , str);
            if(str[0] == 'q'){
                scanf("%d" , &node[i].x);
                node[i].mark = 0;
            }
            else{
                scanf("%d%d" , &node[i].x , &node[i].y);
                if(node[i].x > node[i].y)
                    swap(node[i].x , node[i].y);
                node[i].mark = 1;
                mp[node[i].x*MAXN+node[i].y] = 1;
            }
        }
        solve();
    }
    return 0;
}
时间: 2024-10-21 20:35:37

zoj 3261 Connections in Galaxy War的相关文章

zoj 3261 Connections in Galaxy War:逆向并查集

链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3261 题目: Connections in Galaxy War Time Limit: 3 Seconds      Memory Limit: 32768 KB In order to strengthen the defense ability, many stars in galaxy allied together and built many bidi

并查集专题【完结】

个人整理 并查集 [poj] 第一题 poj 1182 食物链 点击打开链接poj 1182 思路: 带权并查集 分析: 1 典型的带权并查集的题目 2 如果x和y是同类的关系认为是0,如果是x吃y那么关系认为是1,那么x和y的关系为2就说明y吃x 3 那么如果x和y同类则rank[x] == rank[y] , 如果x吃y那么rank[x] == (rank[y]+1)%3 , 注意mod3的使用 点击查看代码 第二题 poj 1308 Is It A Tree? 点击打开链接 poj 130

IBM Connections用户信息定义以及两种保护策略的应用场景

IBM Connections 提供了对每个用户私密数据的强制保护,使得用户数据的安全性能够得到可靠的第三方安全机制的保护.而对于整个企业内部的公开信息,(如公共社区,应用统计,公共数据搜索等),Connections 为客户决策人员和系统管理人员提供了应用级别的强制保护策略和非强制保护策略. 强制保护策略使得用户能够配置某个 Connections 应用的公开信息完全不能被未登录用户访问,从而达到更高的安全级别. 非强制保护策略则相反,它允许某个 Connections 应用的公开信息能够被未

Error:Cannot build Artifact &#039;:war exploded&#039; because it is included into a circul

 使用IDEA 运行web项目时报错: Xml代码   Error:Cannot build Artifact 'web_store:war exploded' because it is included into a circular dependency   解决方法:   删除下面的两个  

the terminal server has exceeded the maximum number of allowed connections

the terminal server has exceeded the maximum number of allowed connections 参考解决方法: http://dog.xmu.edu.cn/2007/07/22/mstsc-3389/   电脑用太久了,最近一直无缘无故重起,重起就会导致连接到的远程终端断开,再也无法再连接,会提示the terminal server has exceeded the maximum number of allowed connections

Java项目打war包的方法

最近好忙好忙,整理下心情给大家分享下自己在工作中遇到的一点小技巧,希望给遇到同样麻烦的同学一点帮助. 我们知道Java项目打war包可以在Eclipse和MyEclipse工具中自动打包,就是右键,然后导出war包就可以了,可是我发现我的一个项目打war包的过程中遇到点小麻烦,导出的war包打开之后,里面少了很多东西,明显有问题.那怎么办呢,网上搜了许多偏方都没效果,请教同事,大家也没遇到过这种状况. 除了这种方法,我们可以运用DOS命令来手工打war包: 首先,打开DOS命令行,敲入"jar&

HDU 1140 War on Weather:三维点之间距离

HDU 1140:http://acm.hdu.edu.cn/showproblem.php?pid=1140 大意:地球球心是(0,0,0),给你k个卫星以及k个卫星的三维坐标(以球心为基准),m个地球上的点以及m个点的三维坐标(以球心为基准),问有多少个点是能被卫星覆盖到的,输出数量. 思路: 求出卫星与地球切线的长度,在地球上,与卫星连线的长度小于切线长度的肯定都能看到. 更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Program

IBM Connections 4.5 中 iWidget 和 OpenSocial Gadget 上手实战

Connections 里 iWidget/OpenSocial Gadget 的历史发展及新变化 IBM Connections 对 iWidget 的支持由来已久,其主要应用在主页(Homepage)和社区(Community)这两个应用上.而对于 Google Gadget 的支持就相对较晚了,在 IBM Connections 4.0 之前甚至只能通过其他变通方法来间接支持(通过在 iWidget 里用 iFrame 包含一个 Gadget 页面).这一情况在 4.0 之后终于得到了改观

IBM Connections Desktop plug-ins for Microsoft Windows新功能

概述 IBM Connections Desktop Plug-ins for Microsoft Windows 是一款提供更加方便更加快捷使用 IBM Connections Files 的桌面插件.使用 IBM Connections Desktop Plug-ins for Microsoft Windows 插件可以直接在用户桌面上查看与管理多个服务器上的文件,无需使用浏览器,一经推出就受到广大用户的青睐.随着 IBM Connections 4.0 的问世, 这款桌面插件的升级版也相