首页 > 其他分享 >L2-013 红色警报(并查集)

L2-013 红色警报(并查集)

时间:2024-05-31 21:00:31浏览次数:22  
标签:City 连通性 lost int 城市 查集 013 L2

1.题目

L2-013 红色警报
分数 25

全屏浏览

切换布局
作者 陈越
单位 浙江大学
战争中保持各个城市间的连通性非常重要。本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报。注意:若该国本来就不完全连通,是分裂的k个区域,而失去一个城市并不改变其他城市之间的连通性,则不要发出警报。

输入格式:
输入在第一行给出两个整数N(0 < N ≤ 500)和M(≤ 5000),分别为城市个数(于是默认城市从0到N-1编号)和连接两城市的通路条数。随后M行,每行给出一条通路所连接的两个城市的编号,其间以1个空格分隔。在城市信息之后给出被攻占的信息,即一个正整数K和随后的K个被攻占的城市的编号。

注意:输入保证给出的被攻占的城市编号都是合法的且无重复,但并不保证给出的通路没有重复。

输出格式:
对每个被攻占的城市,如果它会改变整个国家的连通性,则输出Red Alert: City k is lost!,其中k是该城市的编号;否则只输出City k is lost.即可。如果该国失去了最后一个城市,则增加一行输出Game Over.。

输入样例:
5 4
0 1
1 3
3 0
0 4
5
1 2 0 4 3
输出样例:
City 1 is lost.
City 2 is lost.
Red Alert: City 0 is lost!
City 4 is lost.
City 3 is lost.
Game Over.

2.分析

        判断国家是否连通,我们只需要判断其独立子图的个数,即每失去一个城市(结点),图的子图有无增加。这里就可以用并查集看图有几个父结点就有几个子图。相较麻烦的是每失去一个城市,我们都要重新构建并查集。如果子图变多,那么就是改变了整个国家(图)的连通性。

3.代码

        

#include<iostream>
#include<vector>
using namespace std;
const int MAX=510;
int N,M,K;
int fa[MAX],vis[MAX];  //并查集数组fa[],记录被删除城市的数组vis[]
vector<int> v[MAX];   //二维数组用于存储城市中的路径

//并查集初始化函数
void init(int N){
    for(int i=0;i<N;i++){fa[i]=i;}
}

//并查集查找函数
int find(int x){
    if(fa[x]==x) return x;
    else{
        fa[x]=find(fa[x]);
        return fa[x];
    }
}

//并查集链接函数
void add(int a,int b){
    int f_a=find(a);
    int f_b=find(b);
    fa[f_a]=f_b;
}

//判断图的子图个数
int alive(){
    int uns=0;
    for(int i=0;i<N;i++){
        if(find(i)==i&&!vis[i]) uns++;    //没被删除的城市(结点)才能计算子图
    }
    return uns;
}

//重新构建并查集
void bulid(){
    for(int i=0;i<N;i++){
        for(int j=0;j<v[i].size();j++){
            if(!vis[i]&&!vis[v[i][j]])      //没被删除的结点重新构建并查集
                add(i,v[i][j]);
        }
    }
}
int main(){
    cin>>N>>M;
    int a,b,c;
    init(N);
    for(int i=0;i<M;i++){
        cin>>a>>b;
        add(a,b);
        v[a].push_back(b);              //记录城市间的路径
    }
    cin>>K;
    int n=alive();         //最开始图的子图数
    for(int i=0;i<K;i++){
        cin>>c;
        vis[c]=1;          //记录被删除的城市
        init(N);           //重新初始化并查集
        bulid();           //重新构建并查集
        if(n>=alive()) cout<<"City "<<c<<" is lost."<<endl;  //如果子图没增加连通性就没变
        else cout<<"Red Alert: City "<<c<<" is lost!"<<endl;
        n=alive();
    }
    if(K==N) cout<<"Game Over."<<endl;   //如果删除个数等于结点个数就gg
    return 0;
}

标签:City,连通性,lost,int,城市,查集,013,L2
From: https://blog.csdn.net/m0_75262437/article/details/139361085

相关文章

  • L2-043 龙龙送外卖(C++, 记忆化搜索)
    龙龙是“饱了呀”外卖软件的注册骑手,负责送帕特小区的外卖。帕特小区的构造非常特别,都是双向道路且没有构成环——你可以简单地认为小区的路构成了一棵树,根结点是外卖站,树上的结点就是要送餐的地址。每到中午12点,帕特小区就进入了点餐高峰。一开始,只有一两个地方点外卖,龙......
  • CSP历年复赛题-P1980 [NOIP2013 普及组] 计数问题
    原题链接:https://www.luogu.com.cn/record/160821231题意解读:统计1~n中x的个数。解题思路:枚举每个数,提取每一位,判断是否等于x。100分代码:#include<bits/stdc++.h>usingnamespacestd;intn,x,ans;intmain(){cin>>n>>x;for(inti=1;i<=n;i++)......
  • HTML20_HTML标签3
    一、文件标签构成html最基本的标签html:html文档的根标签head:头标签。用于指定html文档的一些属性。引入外部的资源title:标题标签。body:体标签<!DOCTYPEhtml>:html5中定义该文档是html文档二、文本标签和文本有关的标签1、标签注释:<!--注释内容--><h1>to<......
  • HTML20_HTML入门2
    一、HTML概念是最基础的网页开发语言HyperTextMarkupLanguage超文本标记语言 *超文本: *超文本是用超链接的方法,将各种不同空间的文字信息组织在一起的网状文本. *标记语言: *由标签构成的语言。<标签名称>如html,xml *......
  • 安装fail2ban服务-防止用户暴力破解root密码
    安装fail2ban服务,防止用户暴力破解root密码(最多让试着登录5次,5次密码输错就封杀ip)[root@bogon~]#lsepel-release-6-8.noarch.rpm[root@bogon~]#rpm-ivhepel-release-6-8.noarch.rpm #或yum-yinstallepel-release[root@bogon~]#yuminstallfail2ban-y复制ja......
  • Nginx 实战-01-nginx ubuntu(windows WSL2) 安装笔记
    前言大家好,我是老马。很高兴遇到你。我们为java开发者实现了java版本的nginxhttps://github.com/houbb/nginx4j如果你想知道servlet如何处理的,可以参考我的另一个项目:手写从零实现简易版tomcatminicat手写nginx系列如果你对nginx原理感兴趣,可以阅读:从零......
  • 解决删除文件后 WSL2 磁盘空间不释放的问题
    Tags:#wsl#wsl2#windows今天突然发现 C 盘快满了,想起来之前把 Docker 容器的数据持久化到了 WSL2 的某个目录下,于是就想着把不需要的文件清理了。但清理完毕之后我发现 C 盘的剩余空间并没有变大,非常的奇怪。后来我在网上搜索了很久,终于找到了原因和解决方法。1分析......
  • N5_2013_07_Q3
    问题31ばん今から寝ます。家族に何と言いますか。现在要睡觉了。对家人说什么?1.おやすみなさい晚安2.こんばんは晚上好3.さようなら再见ねる(寝る)动睡觉かぞく(家族)名家人なんと言いますか疑怎么说2ばん時計がありません。時間が知りたいです。何と......
  • Debug-013-el-loading中显示倒计时时间
    前言:            今天实现一个小小的优化,业务上是后端需要从设备上拿数据,所以前端需要不断调用一个查询接口,直到后端数据获取完毕,前后端根据一个ending字段为true判断停止调用查询接口。由于这个查询时间比较久,所以需要一个laoding效果。优化:前端除了根据后......
  • 基于SSH远程访问WSL2(非长期稳定版本)
    to2024/05/31目标使笔记本可以在同一局域网下访问主机的WSL2。部署环境HOST-OS:Windows10,WSL2(Ubuntu20.04)REMOTE-OS:Windows10VSCode-EXTENSION:WSL,Remote-SSH部署过程(主要参考[1,2])WSL2所在主机需要进行的操作:WSL2-bash更新openssh-server:sudoa......