题目连接

题解:连通块问题显然要与并查集有关,而且C4比赛极喜欢出与并查集有关的知识。

这道题可以这样做,即我每次去掉一个城市的时候,都对剩余的城市重新建立并查集,然后判断联通块的数量有没有删减,如果联通块的数量没变说明没有破坏连通性,而如果改变了说明破坏了连通性,这样虽然很暴力,时间复杂度很高,但是仍然能过。。。不得不说数据很弱。

当然这道题也可以这样做,由于当攻陷一个城市的时候,我们需要把并查集分开,但这显然是不现实的,我们可以逆向思维,即倒着想。先将攻打到最后剩余的城市用并查集联通起来,然后倒着考虑每一个被攻打的城市,把这个城市加入到城市网络里,如果并查集合并次数大于1,那么说明这个城市的删除会导致连通性的破坏,那么发出警报。如果合并次数等于1,说明该城市被攻陷不会破坏连通性,因此不需要发出警报。另外需要注意,输出信息需要保存在栈中,在判断结束后,逆序输出生成的信息。

另外,我的代码第一次提交的时候只得了21分,原因是把两个城市加入并查集的时候忘记 判断之间有没有道路了。。。这么严重的问题都能得21分,可见数据只弱。。。

代码:

#include <cstdio>
#include <string>
#include <iostream>
#include <stack>
using namespace std;
const int MAX = 505;
int G[MAX][MAX];
int N,M;
int parent[MAX];
int rem[MAX];
stack<int> stk;
stack<string> outstk;
void init()
{for(int i = 0;i < MAX;i++) parent[i] = i;
}
int find(int x)
{if(parent[x] == x) return x;return parent[x] = find(parent[x]);
}
bool join(int x1,int x2)
{int p1 = find(x1);int p2 = find(x2);if(p1 != p2) {parent[p1] = p2; return true;}return false;
}
int main()
{init();scanf("%d%d",&N,&M);for(int i = 0;i < M;i++){int u,v;scanf("%d%d",&u,&v);G[u][v] = G[v][u] = 1;}int K;scanf("%d",&K);if(K == N) outstk.push("Game Over.\n");while(K--){int c;scanf("%d",&c);rem[c] = 1;stk.push(c);}for(int i = 0;i < N;i++) if(!rem[i]) for(int j = 0;j < N;j++) if(!rem[j] && G[i][j]) join(i,j);while(!stk.empty()){int u = stk.top();stk.pop();rem[u] = 0;int cnt = 0;for(int i = 0;i < N;i++)if(!rem[i] && G[u][i])if(join(u,i))cnt++; if(cnt >= 2){char tmp[100];sprintf(tmp,"Red Alert: City %d is lost!\n",u);outstk.push(tmp);}else{char tmp[100];sprintf(tmp,"City %d is lost.\n",u);outstk.push(tmp);}}while(!outstk.empty()){cout<<outstk.top();outstk.pop();}
}

L2-013 红色警报 并查集相关推荐

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

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

  2. PTA 红色警报(并查集)

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

  3. CCCC L2 007 家庭房产 并查集

    最开始看到这个题,想不到只用并查集,在某一个如果同时又两个其他家庭包括的人怎么办,所有开了一个home类,想通过Home之间的合并解决这个问题,最后由于内容过于庞大而超时. 参考网上的思路用并查集可以 ...

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

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

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

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

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

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

  7. 蓝桥杯刷题013——小猪存钱罐(并查集)

    [题目描述] Byteazar the Dragon 拥有 N 个小猪存钱罐.每一个存钱罐能够用相应的钥匙打开或者被砸开.Byteazar 已经将钥匙放入到一些存钱罐中.现在已知每个钥匙所在的存钱罐, ...

  8. 红色警报 (25 分)【测试点分析】【两种解法】

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

  9. BZOJ 2143 飞飞侠(线段树优化建边 / 并查集优化最短路)【BZOJ修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2143 是 hydro 的 BZOJ ...

最新文章

  1. 静态成员变量不占用类的内存空间
  2. 【Android 应用开发】AndroidUI设计 之 图片浏览器
  3. 【Python】Python字典的高级用法-统计计数
  4. pythin怎么根据月份获取月初和月末_数据统计丨7月份塑料市场明显回暖,8月份是否延续乐观行情?...
  5. 纽曼皮尔逊准则Matlab实现,纽曼-皮尔逊准则,Neyman Pearson Criterion,在线英语词典,英文翻译,专业英语...
  6. 一觉醒来,没有购房资格了!
  7. leetcode - 837. 新21点
  8. 顶会 | 腾讯AI Lab 9篇入选论文解读
  9. TdxRibbon控件的皮肤设置
  10. java html报表设置_快逸报表中html事件属性的使用
  11. python计算复合材料层合板ABD刚度矩阵、预测层合板强度
  12. 【118期分享】简约商务PPT模板免费下载
  13. 2018 考研 408 经验贴——复试
  14. 智慧灯杆解决方案之智慧景区建设
  15. sprintf,snprintf的用法(可以作为linux中itoa函数的补充)
  16. 反编译so库破解so
  17. 页面浏览pdf或图片iframe
  18. winform工具1-图片去除水印
  19. 阿里面试之Hr面,这个套路把我坑惨了......
  20. Tomcat部署与优化

热门文章

  1. c++牛客网面试题05. 替换空格
  2. java char short区别_java 彻底理解 byte char short int float long double
  3. 听红宝书译者谈Web视角下的前端开发
  4. python可变参数和关键字参数位置_python中函数的默认参数和可变长参数如何排列?...
  5. mysql开启gtid dump_mysqldump关于--set-gtid-purged=OFF的使用
  6. spyder 护眼背景
  7. Java线程问题问答
  8. 2019南昌网络赛G. tsy‘s number(反演 + 积性函数O(n)预处理)
  9. Loj #6077. 「2017 山东一轮集训 Day7」逆序对
  10. P2522 [HAOI2011]Problem b