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.

方法一:用dfs判断是否连通并且计算连通数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include<cstdio>
#include<cstring>
using namespace std;
const int maxm = 550;
int edge[maxm][maxm];
int visit[maxm],n;
void (int x){
visit[x] = 1;
for(int i=0;i<n;i++){
if(!visit[i]&&edge[x][i]){
dfs(i);
}
}
}
int Calcnt(){
int cnt = 0;
for(int i=0;i<n;i++){
if(!visit[i]){
dfs(i);
cnt++;
}
}
return cnt;
}
int main()
{
int m;
scanf("%d%d",&n,&m);
memset(edge,0,sizeof(edge));
memset(visit,0,sizeof(visit));
for(int i=0;i<m;i++){
int a,b;
scanf("%d%d",&a,&b);
edge[a][b] = 1;
edge[b][a] = 1;
}
int cntt = Calcnt();
int k,city;
scanf("%d",&k);
for(int i=0;i<k;i++){
scanf("%d",&city);
for(int j=0;j<n;j++){
if(edge[city][j]){
edge[city][j] = 0;
edge[j][city] = 0;
}
}
memset(visit,0,sizeof(visit));
int temp = Calcnt();
if(temp>cntt+1){
printf("Red Alert: City %d is lost!n",city);
}else{
printf("City %d is lost.n",city);
}
cntt = temp;
}
if(k==n){
printf("Game Over.n");
}
return 0;
}

方法二:并查集

1
2
3
4
5
6
7
8
9
10
大专栏  L2-013 红色警报(25 分)>11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include<cmath>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxm = 550;
int n,m;
struct node{
int u,v;
}edge[5005];
int visit[maxm],fa[maxm];
int Find(int x){
if(x==fa[x]){
return fa[x];
}else{
return Find(fa[x]);
}
}
void Union(int x,int y){
int xc = Find(x);
int yc = Find(y);
if(xc!=yc){
fa[xc] = yc;
}
}
int main()
{
int k,u,v;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
fa[i] = i;
}
for(int i=0;i<m;i++){
scanf("%d%d",&u,&v);
edge[i].u = u;
edge[i].v = v;
Union(u,v);
}
int num1 = 0,num2;
for(int i=0;i<n;i++){
if(fa[i]==i){
num1++;
}
}
memset(visit,0,sizeof(visit));
scanf("%d",&k);
for(int j=0;j<k;j++){
num2 = 0;
for(int i=0;i<n;i++){
fa[i] = i;
}
int city;
scanf("%d",&city);
visit[city] = 1;
for(int i=0;i<m;i++){
if(visit[edge[i].u]==1||visit[edge[i].v]==1){
continue;
}else{
Union(edge[i].u,edge[i].v);
}
}
for(int i=0;i<n;i++){
if(fa[i]==i){
num2++;
}
}
if(num1==num2||num1+1==num2){
printf("City %d is lost.n",city);
}else{
printf("Red Alert: City %d is lost!n",city);
}
num1 = num2;
}
num1 = 0;
for(int i=0;i<n;i++){
if(visit[i]==1){
num1++;
}
}
if(num1==n){
printf("Game Over.n");
}
return 0;
}

L2-013 红色警报(25 分)的更多相关文章

  1. L2-013 红色警报 (25分) 并查集复杂度

    代码: 1 /* 2 这道题也是简单并查集,并查集复杂度: 3 空间复杂度为O(N),建立一个集合的时间复杂度为O(1),N次合并M查找的时间复杂度为O(M Alpha(N)), 4 这里Alpha是 ...

  2. L2-013 红色警报 (25 分)

    L2-013 红色警报 (25 分)   战争中保持各个城市间的连通性非常重要.本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报.注意:若该国本来就不完全 ...

  3. L2-013 红色警报 (25 分) (并查集)

    链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805063963230208 题目: 战争中保持各个城市间的连通性非 ...

  4. L2-006 树的遍历 (25 分) (根据后序遍历与中序遍历建二叉树)

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805069361299456 L2-006 树的遍历 (25 分 ...

  5. PAT 甲级 1020 Tree Traversals (25 分)(二叉树已知后序和中序建树求层序)

    1020 Tree Traversals (25 分)   Suppose that all the keys in a binary tree are distinct positive integ ...

  6. PAT天梯赛练习题 L2-013 红色警报(并查集+逆序加边)

    L2-013. 红色警报 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 战争中保持各个城市间的连通性非常重要.本题要求你编写一 ...

  7. PTA - - 06-图1 列出连通集 (25分)

    06-图1 列出连通集   (25分) 给定一个有NN个顶点和EE条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N-1N−1编号.进行搜索时,假设我们总是从编号最小的顶点出发, ...

  8. 天梯赛决赛 L2-1.红色警报 并查集

    L2-013. 红色警报 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 战争中保持各个城市间的连通性非常重要.本题要求你编写一 ...

  9. 中国大学MOOC-陈越、何钦铭-数据结构-2015秋 01-复杂度2 Maximum Subsequence Sum (25分)

    01-复杂度2 Maximum Subsequence Sum   (25分) Given a sequence of K integers { N​1​​,N​2​​, ..., N​K​​ }. ...

随机推荐

  1. java类为什么要实现Serializable接口

    什么是Serializable接口? 一个对象序列化的接口.一个类只有实现了Serializable接口,它的对象才能被序列化. 什么是序列化? 将对象的状态信息转换为可以存储或传输的形式的过程. 在 ...

  2. 四、linux-mysql 下MySQL的管理(一)

    1.mysql启动的实质: 在单实例中,/etc/init.d/mysql start 是一个shell脚本,调用mysqld_safe脚本,最后调用mysqld服务启动mysql. 2. 关闭mys ...

  3. diary-2019.9.16

    It has been observed by various scientists and nutritionists that it is better to have smaller and a ...

  4. Base64转PDF、PDF转IMG(使用pdfbox插件)

    --添加依赖 <!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox --><dependency>  ...

  5. python语法基础-基础-运算符

    ############################################ Python语言支持以下类型的运算符: 算术运算符 比较(关系)运算符 赋值运算符 逻辑运算符 位运算符 成员 ...

  6. Mate20 pro实现H265 (HEVC)实时硬件编码

    谁能告诉我手机上用H265实时编码有什么鸟用? 一.先看看手机支持哪些codec ALL_CODECS REGULAR_CODECS mine-type 选择mime-type为video/hevc, ...

  7. 由情感计算带来的惊喜发现——记Rosalind W. PICARD“21世纪的计算”大会主题演讲

    W. PICARD"21世纪的计算"大会主题演讲" title="由情感计算带来的惊喜发现--记Rosalind W. PICARD"21世纪的计算& ...

  8. A - Divide it! CodeForces - 1176A

    题目: You are given an integer nn. You can perform any of the following operations with this number an ...

  9. 【阅读笔记】rocketmq 概念与架构 (一)

    介绍 rocketmq 框架与基本概念 1. 概念 1.1 namesrv(name server) 记录了 broker 集群信息,消息队列的信息以及 key-value 配置,见 RouteInf ...

  10. 最优化算法——常见优化算法分类及总结

    之前做特征选择,实现过基于群智能算法进行最优化的搜索,看过一些群智能优化算法的论文,在此做一下总结. 在生活或者工作中存在各种各样的最优化问题,比如每个企业和个人都要考虑的一个问题"在一定成 ...