博主最近在写题时遇到一个图论的题,由于博主对图论研究不深和离散数学确实没学好,看到这道题只能大眼瞪小眼,无从下手,后来看了题解还是无从下手,题解中的联通分量和算法一无所知。后来经过博主的不断学习,终于搞明白了这道题,特地分享一下我的学习心得,题目如下

这道题最核心的点是求出简单图联通分量的数量最后的结果res=M-(N-1-(K-1))=M+K-N;
M,N已经知道了,只需要求出联通分量即可,那么什么事联通分量勒,它又该如何求出来勒?
连通分量:无向图的极大连通子图称为的连通分量( Connected Component)。
极大连通子图说的是,如果将连通分量外的任意一个顶点添加进连通分量都会造成不连通。

如上图a可以分成四个联通分量。
那么知道了概念之后该如何求解?
最常见的方法为dfs
#include
#include
using namespace std;
vector> vt;
vector vis;
int N, M;
void dfs(int num) {
vis[num] = true;
for (int neighbor : vt[num]) {
if (!vis[neighbor]) {
dfs(neighbor);
}
}
}
void solution() {
cin >> N >> M;
vt.resize(N + 1);
vis.resize(N + 1, false);
for (int i = 0; i < M; ++i) {
int u, v;
cin >> u >> v;
vt[u].push_back(v);
vt[v].push_back(u);
}
int K = 0;
for (int i = 1; i <= N; ++i) {
if (!vis[i]) {
K++;
dfs(i);
}
}
cout<
评论
还没有任何评论,你来说两句吧!