洛谷 P14077:[GESP202509 七级] 连通图 ← DFS | 并查集
【题目来源】
【题目描述】
给定一张包含 n 个结点与 m 条边的无向图,结点依次以 1,2,…,n 编号,第 i 条边(1≤i≤m)连接结点 ui 与结点 vi。如果从一个结点经过若干条边可以到达另一个结点,则称这两个结点是连通的。
你需要向图中加入若干条边,使得图中任意两个结点都是连通的。请你求出最少需要加入的边的条数。注意给出的图中可能包含重边与自环。
【输入格式】
第一行,两个正整数 n,m,表示图的点数与边数。
接下来 m 行,每行两个正整数 ui,vi,表示图中一条连接结点 ui 与结点 vi 的边。
【输出格式】
输出一行,一个整数,表示使得图中任意两个结点连通所需加入的边的最少数量。
【输入样例一】
4 4
1 2
2 3
3 1
1 4
【输出样例一】
0
【输入样例二】
6 4
1 2
2 3
3 1
6 5
【输出样例二】
2
【数据范围】
对于 40% 的测试点,保证 1≤n≤100,1≤m≤100。
对于所有测试点,保证 1≤n≤10^5,1≤m≤10^5。
【算法分析】
● 代码一的核心代码解析
如果一个图中有 k 个极大连通子图,可以将这 k 个极大连通子图视为 k 个整体,要使这 k 个极大连通子图成为一个连通图,最少要增加 k−1 条边。
(1)DFS 函数
本文这个 DFS 函数的作用是:从给定节点 u 出发,遍历它所在的整个连通块,并将该连通块中的所有节点都标记为 “已访问”。
(2)连通块数量统计
● 代码二的核心代码解析
代码二采用了基础并查集()。
并查集是一种精巧且实用的数据结构,常用于处理不相交集合的合并问题。经典应用有Kruskal算法、LCA、连通子图等。
【算法代码一:DFS】
【算法代码二:并查集】
【参考文献】

浙公网安备 33010602011771号