首页 > 其他分享 >逆序并查集

逆序并查集

时间:2024-03-30 13:11:36浏览次数:25  
标签:连通 int 查集 cnt2 cnt1 分量 find 逆序

以L2-013 红色警报为例

原题链接

https://pintia.cn/problem-sets/994805046380707840/exam/problems/994805063963230208?type=7&page=1

下面贴上代码

#include<iostream>
 
using namespace std;
 
const int N=510;
 
int p[N],g[N][N];
 
int find(int x)
{
    if(x!=p[x]) p[x]=find(p[x]);
    return p[x];
}
 
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=0;i<n;i++) p[i]=i;//初始化
    while(m--)
    {
        int a,b;
        cin>>a>>b;
        p[find(a)]=find(b);
        g[a][b]=g[b][a]=1;//标记
    }
    int k,x,cnt1=0;//cnt1记录攻占前的连通分量个数
    for(int i=0;i<n;i++)
        if(find(i)==i) cnt1++;
    cin>>k;
    while(k--)
    {
        int cnt2=0;//cnt2记录攻占后的连通分量个数
        cin>>x;
        for(int i=0;i<n;i++)
            g[x][i]=g[i][x]=0;//攻占之后取消标记
        for(int i=0;i<n;i++) p[i]=i;//重新初始化
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                if(g[i][j]) p[find(i)]=find(j);
        for(int i=0; i<n;i++)
            if(find(i)==i) cnt2++;
        if(cnt2-cnt1>1) printf("Red Alert: City %d is lost!\n",x);
        else printf("City %d is lost.\n",x);
        cnt1=cnt2;//更新攻占前的连通分量
    }
    if(cnt1==n) cout<<"Game Over.";//表示全部不连通
    return 0;
}

标签:连通,int,查集,cnt2,cnt1,分量,find,逆序
From: https://www.cnblogs.com/1DeomS2/p/18105359

相关文章

  • CF746 期望+逆序对
    Link题意:给定一个\(1\)到\(n\)的排列,等概率选一段区间\([l,r]\)随机排序,求期望逆序对数。\[E=\dfrac{\sum(cnt_{[1,n]}-cnt_{[l,r]}+E_{len})}{\dfrac{n\times(n+1)}{2}}\]\(cnt_{[l,r]}\)表示原序列\([l,r]\)内部逆序对数。\(E_{len}\)表示长度为......
  • 【LeetCode】LeetCode 547. 省份数量(Java版 什么是并查集)
      ......
  • 【洛谷 P8654】[蓝桥杯 2017 国 C] 合根植物 题解(并查集)
    [蓝桥杯2017国C]合根植物题目描述w星球的一个种植园,被分成m×nm\timesnm×n个小格子(东西方向......
  • 为什么并查集可以用来判环
    本篇适合了解并查集基本运行原理的人并查集(FindUnion)Find的意思就是查找某个元素属于哪个集合集合的标志用祖先来表示如果两个元素的祖先一样那么这两个元素属于一个集合Union的意思是合并两个元素,让这两个元素处于同一祖先下并查集用来判环的原理就是如果两个元素处于同......
  • 十五 528. 奶酪 (并查集)
    528.奶酪(并查集)思路:大体就是并查集的模板,空洞数组从1到n,增加0作为下表面,n+1作为上表面,遍历所有空洞,若与上下表面相切或是相交就将ijoin到0或n+1,然后再比较任意两个空洞,两者相切或是相交就join起来,最后判断0与n+1是否相连。importjava.util.*;publicclassMain{......
  • 并查集专题(附并查集模板)P3367 【模板】并查集 P1656 炸铁路
    并查集模板f数组要初始化autofind(autox){if(f[x]==x)returnx;elsereturnf[x]=find(f[x])路径压缩,同一条路上都归到一个点上}voidunionset(autoa,autob){f[find(a)]=find(b);auto会自动适配数据类型} P3367【模板】并查集题目描述如题......
  • 字符串逆序
    文章目录一、字符串?二、思路三、运行代码 一、字符串?在C语言中,字符串实际上是使用空字符 \0 结尾的一维字符数组。因此,\0 是用于标记字符串的结束。二、思路从左++和右--到中间。赋值最左边和最右边给指针left、right,然后通过left++、right--进行逆序。......
  • 并查集(反集)进阶 P1892 [BOI2003] 团伙
    现在有 n 个人,他们之间有两种关系:朋友和敌人。我们知道:一个人的朋友的朋友是朋友一个人的敌人的敌人是朋友现在要对这些人进行组团。两个人在一个团体内当且仅当这两个人是朋友。请求出这些人中最多可能有的团体数。输入格式第一行输入一个整数 n 代表人数。第二行......
  • 蓝桥杯算法集训 - Week 4:BFS、并查集、Flood Fill、哈希、单调栈/队列
    蓝桥杯算法集训-Week4本系列随笔用于整理AcWing题单——《蓝桥杯集训·每日一题2024》的系列题型及其对应的算法模板。一、BFSBFS算法复习参考:BFS(Java)广度优先搜索简单介绍、模板、案例(一)Ⅰ、代码模板staticvoidbfs(Troot){//双端队列,用来存储元素D......
  • 并查集
    并查集畅通工程某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?Input测试输入包含若干测试......