团体天梯练习 L2-013 红色警报
L2-013 红色警报
战争中保持各个城市间的连通性非常重要。本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报。注意:若该国本来就不完全连通,是分裂的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.
解题思路
简单概括一下题意,即处理多个询问,每个询问删除一个点,判断此时图中连通块的个数。如果连通块个数没有变,则输出 “City k is lost.”;如果删除某个点造成图中的连通性改变,则需要额外输出“Red Alert: ”。对于是否形成了
一开始我没太理解题意,以为是判断图中的割点,我还一直心想PTA怎么会考这种比较偏的知识,然后写了个
所以,应当再没删除一个点与相关的边之后,重新建图,然后判断连通块数量。对于判断连通性,有
/* 一切都是命运石之门的选择 El Psy Kongroo */
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<queue>
#include<deque>
#include<stack>
#include<map>
#include<set>
#include<bitset>
#include<cmath>
#include<functional>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<int, pii> piii;
typedef pair<double, double> pdd;
typedef pair<string, int> psi;
//typedef __int128 int128;
#define PI acos(-1.0)
#define x first
#define y second
//int dx[4] = {1, -1, 0, 0};
//int dy[4] = {0, 0, 1, -1};
const int inf = 0x3f3f3f3f, mod = 1e9 + 7;
const int N = 510;
int fa[N], n, m, k;
bool del[N]; //标记删除的点
vector<pii> edges;
int pre, after; //之前连通块的数量 之后连通块的数量
int find(int x){
return fa[x] == x ? x : (fa[x] = find(fa[x]));
}
void Union(int x, int y){
int fx = find(x), fy = find(y);
if(fx == fy) return;
fa[fy] = fx;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> n >> m;
for(int i = 0; i < n; i ++ ) fa[i] = i;
while(m -- ){
int u, v; cin >> u >> v;
edges.push_back({u, v}); //存储所有的关系
Union(u, v);
}
for(int i = 0; i < n; i ++ )
if(fa[i] == i) pre ++ ; //现阶段连通块数量
cin >> k;
bool flag = (k == n); //是否形成GameOver的局面
while(k -- ){
int x; cin >> x;
del[x] = true;
//重新建立并查集
for(int i = 0; i < n; i ++ ) fa[i] = i;
for(auto &[u, v] : edges){
if(del[u] || del[v]) continue;
Union(u, v);
}
after = 0;
for(int i = 0; i < n; i ++ )
if(fa[i] == i && !del[i]) after ++ ; //之后连通块数量
if(after > pre) cout << "Red Alert: City " << x << " is lost!" << endl;
else cout << "City " << x << " is lost." << endl;
pre = after;
}
if(flag) cout << "Game Over.";
return 0;
}
一切都是命运石之门的选择,本文章来源于博客园,作者:MarisaMagic,出处:https://www.cnblogs.com/MarisaMagic/p/17326196.html,未经允许严禁转载
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具