连通分量
无向图G的极大连通子图称为G的连通分量(Connected Component)。任何连通图(任意两个顶点之间可达的图)都只有一个连通分量,即自身,非连通图有多个连通分量。
深度优先搜索的特点非常适合用于求解图的连通分量,每一次深度优先遍历所经过的顶点就是一个连通分量。因此只需要对图的每一个顶点调用一次深度优先遍历(注意标记访问过的顶点),就可以求得所有的连通分量。
/*
struct UndirectedGraph
{
size_t V, E; //V表示顶点数,E表示边数
map<int, forward_list<int>> adj;
};
*/
void dfs(UndirectedGraph &graph, vector<int> &visited, vector<pair<int, int>> &cc, int v)
{
visited.at(v) = 1;
cc.push_back(v);
for (const int &i : graph.adj.at(v))
{
if (visited.at(i) == 0)
{
cc.push_back(make_pair(v, i));
dfs(graph, visited, i);
}
}
}
vector<vector<pair<int, int>>> Fi