觐有 发表于 昨天 13:17

在强连通分量的判断中使用BFS

先理清楚概念:与无向图有关的是块,与有向图有关的是强连通分量
强连通分量:分量中任意两点都能相互可达
问题:在有向图中寻找某个顶点所在的的强连通分量,洛谷模板题
输入:n个点,m条边,m行输入        v    x
想法:假设要找0所在的强连通分量,可能存在两种性质的点        X:由0点可达的点 Y:能到达0点的点
情形1:若存在可到达0的点,那么从该点开始在反图中进行BFS,遍历到的点都打上Y标记,结束后再从0开始BFS(原图),遍历到的点打上X标记,X和Y重合的点就是与0点在同一强连通分量内的点
情形2:不存在可到达0的点,也就是没有入度,那0点本身就是一个强连通分量
情形3:不存在可从0点出法能到达的点,也就是没有出度,那0点本身就是一个强连通分量
证明:由于强连通分量内的点两两相互可达,存在v和x,若它们相对于0点都具有重合的xy性质,那么存在路径(v, 0)(0, v), (x, 0), (0, x),也就存在(v,0,x)与(x,0,v)两条路径致使x与v相互可达
若将0点换为任意顶点,则可以查找所有的强连通分量
此方法部分受 Kosaraju 算法的启发,算是我想了小半个月的结果,但是测试下来

洛谷强连通分量链接:https://www.luogu.com.cn/problem/B3609
这是ACcode,或许可以在很多类似的题力使用,再修改一下就可以判定动态图的连通性了
点击查看代码#include #include #include #include#include #include #define typedef#define max 100001using namespace std;typedef struct edge{        int v;        int x;};typedef struct vertex{        int v = 1;        vectorin_index;        vectorout_index;        int x;        int y = 0;        //int b = 1;};void out(int c){        coutn >> m;        edge edge; vertex ver;        for (int i = 1; i > edge.v >> edge.x;                ver.v].out_index.push_back(i);                ver.x].in_index.push_back(i);        }                queues_y;        ver.x = -1; //start from 1 as a root        for (int i = 1; i
页: [1]
查看完整版本: 在强连通分量的判断中使用BFS