PAT 甲级测试题目 -- 1013 Battle Over Cities

题目链接

题目描述

??给你城市的数量 N(N<1000),城市中地铁的数量 M 以及 被可能占领的城市数量 K(每一次只占领一个城市,并且每次占领的城市不一样),接下来的 M 行根据地铁的数量给出每个地铁连接的两个城市编号。最后一行给你被占领的城市序列。城市编号为 1 到 N,请你求出若某个城市被占领了,连通剩下城市所需要修建的地铁个数。

分析

??该题考察图的存储以及遍历。本题的难点在于把 “需要维修多少个地铁” 这个问题转换成 “需要多少次 dfs 才能遍历完整个图”。因为倘若图不是连通的,则它的各个部分需要执行大于 1 次的 DFS 才能够遍历图中的每一个节点。

实现

#include <iostream>
#include <string.h>

using namespace std;

#define maxn 1001

// 变量定义
int total_cities, highways, check_cities; // 总城市 城市之间的地铁 被检查的城市
bool highway_map[maxn][maxn]; // 定义地铁地图
int check_list[maxn];   // 定义检查列表用于存储检查的城市
bool checked_cities[maxn]; // 判断是否检查过这个城市

// 定义方法递归实现 dfs 遍历节点
void CheckHighway(int source_city) {
    // 没查看过就标记为已查看
    checked_cities[source_city] = true;
    // 查看当前城市连接的城市
    for (int i = 1; i <= total_cities; ++i) {
        // 若该城市没被检查过(缩短递归次数)并且 含有该城市
        if (!checked_cities[i] && highway_map[source_city][i])
            CheckHighway(i);
    }

}

int main() {
    // 初始化变量
    scanf("%d%d%d", &total_cities, &highways, &check_cities);

    for (int i = 0; i < highways; ++i) {             // 构建城市地铁图
        int source_city, aim_city;  // 定义变量接收 源城市 目标城市
        scanf("%d%d", &source_city, &aim_city);
        highway_map[source_city][aim_city] = true; // 将两个城市对应的值均设置为 true,表示两城市是连通的
        highway_map[aim_city][source_city] = true;
    }

    for (int i = 0; i < check_cities; ++i) {    // 构建检查城市列表
        scanf("%d", &check_list[i]);
    }

    // 计算需要维修公路的数量
    int times = 0; // 计算需要维修多少条公路
    for (int i = 0; i < check_cities; ++i) {    // 根据需要检查的城市数量检查城市
        times = 0;
        memset(checked_cities, false, sizeof(checked_cities)); // 初始化已检查过的城市为 false
        checked_cities[check_list[i]] = true; // 将被掠夺的城市设置为 true
        for (int j = 1; j <= total_cities; ++j) {
            if(!checked_cities[j]){
                times++;
                CheckHighway(j);
            }
        }
        printf("%d\n", times-1);

    }
}

自己碰上的难点

  1. 初期实现的时候打算使用 map<int, vector> 数据类型存储图,最后时间空间均超限。
  2. 然后使用 bool 类型的二维数组存储图,并且数据类型能用 bool 尽量用 bool,最大的数据类型只是 int。解决了空间存储问题,但是仍未解决时间问题
  3. 去网上看了一个 AC 代码,尝试将 cout 和 cin 换成 printf 以及 scanf。代码 AC 了
    结论:对于可以不用 STL 的 并且 需要存储大量数据,执行多次循环的代码,使用 c 风格代码较好

原文地址:https://www.cnblogs.com/Breathmint/p/10316380.html

时间: 2024-10-31 17:53:59

PAT 甲级测试题目 -- 1013 Battle Over Cities的相关文章

PAT 甲级测试题目 -- 1009 Product of Polynomials

题目链接 这题占个坑吧...我用了两种思路,一种将保存结果的数组初始化为 0,把乘积加上去,顺便记录下最后一个指数的值.用两次 2000 次 for 循环过滤掉 0 值以及输出答案,这个代码过了,但是后期测试的时候,有些测试用例会多出来空格,有些则格式不对..但是过了... 代码如下 #include<iostream> #include<stdio.h> using namespace std; int main() { double A[1001], B[1001]; int

PAT甲题题解-1013. Battle Over Cities (25)-求联通分支个数

题目就是求联通分支个数删除一个点,剩下联通分支个数为cnt,那么需要建立cnt-1边才能把这cnt个联通分支个数求出来怎么求联通分支个数呢可以用并查集,但并查集的话复杂度是O(m*logn*k)我这里用的是dfs,dfs的复杂度只要O((m+n)*k)这里k是指因为有k个点要查询,每个都要求一下删除后的联通分支数.题目没给定m的范围,所以如果m很大的话,dfs时间会比较小. for一遍1~n个点,每次从一个未标记的点u开始dfs,标记该dfs中访问过的点.u未标记过,说明之前dfs的时候没访问过

PAT 甲级测试题目 -- 1010 Radix

题目链接 题目描述 给你两个数以及其中一个数的基数(进制数),找出另一个数的基数,找不到就输出 Impassible 分析 思路不是很难,基本可以用进制转换加循环判断做,但是有坑... 坑1:上界不是36....上界是确定的那个数的十进制加 1 . 坑2:暴力循环会导致时间超限,用二分法解决 坑3:二分过程中会有数据溢出,得到的负数处理方式和找到较大数处理方式一样,因为溢出的数和题目条件不符,所以可以舍弃. 实现 #include<iostream> #include<string.h&

PAT 甲级测试题目 -- 1012 The Best Rank

题目链接 题目描述 输入小于等于 2000 的数据 N,M,分别表示 学生的总数 和 查询学生的数量 输入 N 个学生的六位数 id 以及 C,M,E 三科成绩.输入 M 个查询学生的 id. 要求输出: 若被查询的 id 不存在,输出 N/A 若被查询的 id 存在,输出 C,M,E,A(average 平均分) 四个成绩中排名最高的排名,以及对应的分数类型(C, M, E, A).若有多余一个类型的分数相同,则按照 A > C > M > E 的优先序列输出 排名 和 分数类型 分析

pat 甲级测试题目 -- 1016 Phone Bills

题目链接 题目描述 要求计算银行账单. 输入 第一行给你一天24小时(00:00~01:00 ...)每个小时每分钟的话费,单位是美分 第二行给你顾客列表(N 个) 接下来的 N 行是顾客的账单详情 CYLL 01:01:06:01 on-line 姓名 月:日:小时:分钟 状态 CYLL 01:28:16:05 off-line 姓名 月:日:小时:分钟 状态 on-line 和 off-line 必须一一对应该记录才有效 输出 对于输入有效的顾客,给出该顾客这个月的账单,格式如下 CYJJ

PAT 甲级 1013 Battle Over Cities (25 分)(图的遍历,统计强连通分量个数,bfs,一遍就ac啦)

1013 Battle Over Cities (25 分) It is vitally important to have all the cities connected by highways in a war. If a city is occupied by the enemy, all the highways from/toward that city are closed. We must know immediately if we need to repair any oth

1013. Battle Over Cities (25)——PAT (Advanced Level) Practise

题目信息: 1013. Battle Over Cities (25) 时间限制 400 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue It is vitally important to have all the cities connected by highways in a war. If a city is occupied by the enemy, all the highways from/toward th

PAT Advanced Level 1013 Battle Over Cities (25)(25 分)

1013 Battle Over Cities (25)(25 分) It is vitally important to have all the cities connected by highways in a war. If a city is occupied by the enemy, all the highways from/toward that city are closed. We must know immediately if we need to repair any

pat 1013 Battle Over Cities(25 分) (并查集)

1013 Battle Over Cities(25 分) It is vitally important to have all the cities connected by highways in a war. If a city is occupied by the enemy, all the highways from/toward that city are closed. We must know immediately if we need to repair any othe