小欧正在扮演一个中世纪的皇帝。地图上有 n 个城市,其中有 m 条道路,每条道路连接了两个城市。 小欧占领了其中一些城市。如果两个城市可以通过若干条道路互相到达,且这些道路经过的城市都是小欧占领的,那么这两个城市之间就可以通过经商获得收益 1 。请注意,每两个城市之间的收益只会被计算一次。 现在,小欧准备占领一个未被占领的城市,使得总收益最大化。你能帮帮她吗?
第一行输入两个正整数 n,m ( 1 ≤ n,m ≤ 10^5) ,代表城市数量和道路数量。 第二行输入一个长度为 n 的 01 串。第 i 个字符为 '0' 代表小欧未占领该城市,'1' 代表小欧已经占领了该城市。 接下来的 m 行,每行输入两个正整数 u,v (1 ≤ u,v ≤ n, u ≠ v) ,代表城市 u 和城市 v 有一条道路连接。
输出一行两个空格隔开的整数,第一个整数代表占领的城市编号,第二个整数代表占领后的收益。 请保证收益的最大化。如果有多种方案收益最大,小欧会优先占领编号最小的城市。
5 5 01010 1 2 1 3 1 4 4 5 1 5
1 3
考点:图
数据规模 n ≤ 1e5 | 限制 1 秒 / 256MB | 标准输入输出
推荐方向:图
本题切入点
占领城市后收益来自「被占领城市的连通块」规模;用并查集维护连通块大小,枚举每个未占领城市计算它加入后带来的收益增量。
把关系抽象成点与边,再按问的类型选遍历/最短路/连通性算法。
思路框架(图 通法 · 非本题专属)
实现要点:注意是有向图还是无向图,无向图加边记得双向。
复杂度:时间 O(V+E) 遍历 / O(E log V) Dijkstra | 空间 O(V+E)
该范式的通法易错点
对照本题
样例 1:输入 5 5 / 01010 / 1 2 / 1 3 / 1 4 / 4 5 / 1 5 → 输出 1 3
占领 1 号城市后,总收益为 3。
1 号城市和 2 号城市经商,1 号城市和 4 号城市经商,2 号城市和 4 号城市经商。
解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。
本题来源:2024年秋招-OPPO-算法岗笔试。