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

解题思路:
本题用并查集解。先用一个结构体把数据存下来,通过多次重建、比较,得出答案,如果销毁城市后集合数增加,则连通性改变,其它情况都是不变的。这种做法时间复杂度挺高,但这道题没有超时。

代码:

#include<iostream>
using namespace std;
int f[5000],vis[5000];
int find(int a)//并查集,路径压缩
{if(a!=f[a])return f[a]=find(f[a]);return f[a];
}
struct aa
{int x,y;
}n[5000];
int main()
{int a,b,c,d,e,g,h,i,j,ans1=0,ans2=0;cin>>a>>b;for(i=0;i<a;i++)f[i]=i;for(c=0;c<b;c++){cin>>d>>e;n[c].x=d;n[c].y=e;h=find(d);g=find(e);if(g!=h)f[h]=g;}for(c=0;c<a;c++)if(f[c]==c)ans1++;cin>>c;while(c--)//每一次都重新建立并查集{for(i=0;i<a;i++)//重置f[i]=i;cin>>d;vis[d]=1;//标记,毁掉的就丢弃for(i=0;i<b;i++){if(vis[n[i].x]||vis[n[i].y])continue;h=find(n[i].x);g=find(n[i].y);if(g!=h)f[h]=g;}ans2=0;for(i=0;i<a;i++)if(vis[i]==0&&f[i]==i)ans2++;if(ans2>ans1)cout<<"Red Alert: City "<<d<<" is lost!"<<endl;//改变连通性则集合数增加,注意不能写成ans2==ans1+1,例如十字路口却中间就会变成4块else cout<<"City "<<d<<" is lost."<<endl;ans1=ans2;if(ans2==0)cout<<"Game Over."<<endl;//不存在集合就不存在城市了}
}

PTA 红色警报(并查集)相关推荐

  1. C++ (PTA) 红色警报 并查集

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

  2. L2-013 红色警报 并查集

    题目连接 题解:连通块问题显然要与并查集有关,而且C4比赛极喜欢出与并查集有关的知识. 这道题可以这样做,即我每次去掉一个城市的时候,都对剩余的城市重新建立并查集,然后判断联通块的数量有没有删减,如果 ...

  3. pta 计算机通信(并查集)

    有n台计算机,编号为1到n.设定如果计算机a和计算机b可以通信,则计算机b和计算机a亦可以通信:如果计算机a和计算机b可以相互通信,计算机b和计算机c可以相互通信,则计算机a和计算机c亦可以相互通信. ...

  4. PTA  部落(并查集)

    7-14 部落(35 分) 在一个社区里,每个人都有自己的小圈子,还可能同时属于很多不同的朋友圈.我们认为朋友的朋友都算在一个部落里,于是要请你统计一下,在一个给定社区中,到底有多少个互不相交的部落? ...

  5. C++学习之路 | PTA(天梯赛)—— L2-013 红色警报 (25分)(带注释)(并查集)(精简)

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

  6. 【CCCC】L2-013 红色警报 (25分),,并查集计算集合个数

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

  7. 7-34 红色警报 (10 分)(结构体并查集)

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

  8. C++学习之路 | PTA(甲级)—— 1114 Family Property (25分)(带注释)(并查集)(精简)

    1114 Family Property (25分) This time, you are supposed to help us collect the data for family-owned ...

  9. C++学习之路 | PTA(天梯赛)—— L2-007 家庭房产 (25分)(带注释)(并查集)(精简)

    L2-007 家庭房产 (25分) 给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产套数. 输入格式: 输入第一行给出一个正整数N(≤1000),随后N行,每行按 ...

最新文章

  1. 打开sql server 验证
  2. 9月22日培训日记(上)
  3. 工作篇-佛山三水恒大-2020.11.13
  4. 稳压电源的设计与制作_电子爱好设计的直流可调压电源电路,太完美了,有图,亲测可用...
  5. Duilib初级控件扩展一例: 具有鼠标滚动消息的OptionUI
  6. SNOI2017 礼物
  7. 硬件射频测试和软件的区别,细说拉力试验机软件与硬件之间的区别
  8. namespace MyProject 买来的二手车怎么查询是否发生过违章或交通事故,要查二手车的维修保养记录和出险记录?
  9. 手机浏览器获取某东cookie
  10. 分别使用while、do-while和for循环输出1-1000中含有7或者7倍数的整数之和及个数-详解
  11. Tilemap瓦片地图
  12. teablue数据分析_数据分析-05 数据可视化
  13. 腾讯的野望:一个游戏公司怎么拯救世界?
  14. Linux常见的压缩工具
  15. C语言中的连等式解析
  16. 卡西欧电子计算机怎么换电池,卡西欧电池怎么换
  17. 推荐算法之用户行为分析
  18. ROS melodic+Astra s编译运行ros_astra_camera实录(踩坑没填完)
  19. 《软考填涂答题卡须知》
  20. 雷达多普勒频率计算公式_雷达流速仪(非接触流速仪、表面流速仪)

热门文章

  1. JS 创建A标签打开窗口
  2. [转]Patch文件结构详解
  3. 使用Egret插件压缩代码包体积,减少请求数量的实战教程
  4. Qt开发总结(21)——Qwt第三方绘图组件
  5. 热闹的聚会与尴尬的聚会_如何创建成功的聚会小组
  6. 接入HMS Core应用内支付服务过程中一些常见问题总结
  7. gstreamer-1.0学习笔记
  8. 《Linux操作系统-系统移植》第8章 USB-4G/LTE移植 -第3节 USB-4G移植(移远AG35开发-Gobi拨号)
  9. 数字化转型导师坚鹏:数字化转型背景下的保险公司人力资源管理
  10. Godot Engine:CSG(Constructive Solid Geometry)工具