博客
关于我
L2-013 红色警报 (25 分)
阅读量:390 次
发布时间:2019-03-05

本文共 2312 字,大约阅读时间需要 7 分钟。

为了解决这个问题,我们需要编写一个报警程序,判断当一个城市被攻占后是否会导致国家连通性被破坏。如果破坏连通性,则发出红色警报;否则,只输出普通信息。最后,如果所有城市都被攻占,输出“Game Over”。

方法思路

  • 问题分析:我们需要判断被攻占的每个城市是否会破坏国家的连通性。连通性破坏意味着连通分量的数量增加。
  • 并查集:使用并查集数据结构来高效管理和查询连通分量。每次处理一个被攻占的城市时,标记该城市,并重新计算连通分量的数量。
  • 处理流程:
    • 初始化并查集。
    • 处理每个被攻占的城市,标记为失去。
    • 重新遍历所有道路,合并未被失去的城市。
    • 计算当前连通分量的数量。
    • 比较处理后的连通分量数量与处理前的数量,判断是否破坏连通性。
  • 输出结果:根据连通性破坏情况输出相应信息,最后判断是否所有城市都被失去。
  • 解决代码

    #include 
    using namespace std;#define INF 0x3F3F3F3F#define pb push_backconst int N = 500 + 1;const int MOD = 1e9 + 7;int par[N], rnk[N];void init(int n) { for (int i = 0; i < n; ++i) { par[i] = i; rnk[i] = 1; }}int find(int x) { if (par[x] == x) return x; return par[x] = find(par[x]);}void unite(int x, int y) { x = find(x); y = find(y); if (x == y) return; if (rnk[x] < rnk[y]) { par[x] = y; } else { par[y] = x; if (rnk[y] == rnk[x]) rnk[x]++; }}int main() { int n, m; cin >> n >> m; init(n); for (int i = 0; i < m; ++i) { int x, y; cin >> x >> y; unite(x, y); } vector
    > roads(m); for (int i = 0; i < m; ++i) { int x, y; cin >> x >> y; roads[i] = make_pair(x, y); } int k; cin >> k; vector
    lostCities; for (int i = 0; i < k; ++i) { int x; cin >> x; lostCities.push_back(x); } bool lost[N] = false; for (int x : lostCities) { lost[x] = true; int cnt0 = 0; for (int i = 0; i < n; ++i) { if (par[i] == i) cnt0++; } for (int i = 0; i < m; ++i) { int u = roads[i].first; int v = roads[i].second; if (!lost[u] && !lost[v]) { unite(u, v); } } int cnt = 0; for (int i = 0; i < n; ++i) { if (par[i] == i) cnt++; } if (cnt > cnt0) { cout << "Red Alert: City " << x << " is lost!" << endl; } else { cout << "City " << x << " is lost." << endl; } if (lost[n-1]) { cout << "Game Over." << endl; } } return 0;}

    代码解释

  • 并查集初始化:init函数初始化并查集,设置每个城市为自身父节点,秩为1。
  • 查找:find函数用于查找节点的根,路径压缩优化了查找速度。
  • 合并:unite函数用于合并两个节点的集合,按秩合并,路径压缩优化了合并速度。
  • 主函数:
    • 读取输入数据,初始化并查集。
    • 处理每个被攻占的城市,标记为失去。
    • 重新遍历所有道路,合并未被失去的城市。
    • 计算连通分量数量,判断是否破坏连通性。
    • 输出结果,判断是否所有城市都被失去。
  • 转载地址:http://liwzz.baihongyu.com/

    你可能感兴趣的文章
    Python:将列表列表初始化为一定大小,
    查看>>
    Python:带有生成器的给定集合的幂集
    查看>>
    Python:按字符的位置拆分字符串
    查看>>
    Python:替换嵌套字典中的值
    查看>>
    Python:爬取数据出现response.status_code为403解决方法
    查看>>
    Python:爬取数据出现response.status_code为418解决方法
    查看>>
    Python:生成“元组集“;来自“元组列表“;不考虑顺序
    查看>>
    Python:生成具有趋势的随机时间序列数据(例如周期性、指数衰减等)
    查看>>
    Python:用渐进式数字重命名列表中的重复项而不对列表进行排序
    查看>>
    Python:矩形参数无效
    查看>>
    Python:语法进阶
    查看>>
    Python:调用复制函数时调用 Python 对象时超出了最大递归深度
    查看>>
    Python:这两个 import 语句有什么区别?
    查看>>
    Python:通过串口从 Velleman k8090 读取数据
    查看>>
    python:遍历具有列表值的字典
    查看>>
    Python:降低精度 pandas 时间戳数据帧
    查看>>
    python:非阻塞子进程,检查标准输出
    查看>>
    PythonABC多重继承
    查看>>
    Pythonargparse中的多个参数
    查看>>
    Python关于 *args 和 **kwargs 参数的详解(全)
    查看>>