#19284. 合纵连横
合纵连横
你好!我是你的OI金牌教练。
这一期“历史+编程”特训,我们将穿越到中国历史上最动荡也最精彩的战国时期。我们将结合**“合纵连横”**的外交策略,来讲解图论中最基础也最重要的概念——图的遍历与连通块 (Connected Components)。
这道题目符合 GESP 6级 难度。GESP 6级要求掌握基本的图的存储(邻接表)以及广度优先搜索 (BFS) 或 深度优先搜索 (DFS) 来解决连通性问题。
第一部分:背景知识讲解
1. 战国七雄 (The Seven Warring States)
战国时期(公元前475年—公元前221年),诸侯兼并,最终形成了齐、楚、燕、韩、赵、魏、秦七个强大的诸侯国,史称“战国七雄”。
2. 合纵与连横 (Vertical and Horizontal Alliances)
为了在激烈的兼并战争中生存,各国之间展开了复杂的外交斗争。
- 合纵 (Hezong):苏秦主张“合众弱以攻一强”,即六国结盟共同抵抗强秦。南北为纵,故称合纵。
- 连横 (Lianheng):张仪主张“事一强以攻众弱”,即秦国拉拢一些国家去攻打其他国家。东西为横,故称连横。
3. 算法模型:连通性
在外交结盟中,存在一种传递性: 如果 赵国 与 魏国 结盟,魏国 与 楚国 结盟,那么在战略上,赵、魏、楚 三国就形成了一个同盟集团。 在计算机科学中,我们将国家看作节点 (Vertex),结盟关系看作边 (Edge)。 一个相互之间都有直接或间接结盟关系的国家集合,就是一个连通块 (Connected Component)。
第二部分:题目内容
题目名称:合纵连横 (Alliance Strategy)
题目描述
战国时期,局势瞬息万变。地图上共有 座城池,编号为 到 。 为了抵御强敌,各城池之间签署了 份结盟条约。 第 份条约规定:城池 和城池 建立同盟关系。 注意:同盟关系具有传递性。如果 A 和 B 结盟,B 和 C 结盟,那么 A、B、C 三座城池就被视为处于同一个同盟集团中。
作为纵横家,你需要分析当前的天下大势。请你编写程序,计算出:
- 当前天下共有多少个独立的同盟集团?
- 在所有同盟集团中,规模最大(包含城池数量最多)的集团有多少座城池?
输入格式
第一行包含两个正整数 。
- 表示城池的数量。
- 表示结盟条约的数量。
接下来 行,每行包含两个正整数 ,表示城池 和 之间建立了一条结盟关系(无向边)。
输出格式
输出一行,包含两个整数,中间用空格隔开。
- 第一个整数表示独立同盟集团的数量(连通块个数)。
- 第二个整数表示最大的同盟集团包含的城池数。
输入输出样例 #1
输入:
6 4
1 2
2 3
4 5
5 6
输出:
2 3
样例 #1 解释:
- 关系:1-2, 2-3。于是 {1, 2, 3} 形成一个同盟集团,大小为 3。
- 关系:4-5, 5-6。于是 {4, 5, 6} 形成一个同盟集团,大小为 3。
- 共有 2 个集团。
- 最大的集团大小为 3。
输入输出样例 #2
输入:
5 3
1 2
2 3
1 3
输出:
3 3
样例 #2 解释:
- 关系:1-2, 2-3, 1-3。这三座城构成一个三角形的同盟 {1, 2, 3},大小为 3。
- 城池 4 没有结盟,自己算一个集团 {4},大小为 1。
- 城池 5 没有结盟,自己算一个集团 {5},大小为 1。
- 共有 3 个集团({1,2,3}, {4}, {5})。
- 最大的集团大小为 3。
数据范围
对于 的数据:
- 可能存在重边或自环(虽然对连通性无影响,但程序需兼容)。