Path 检查删除图中的边是否会导致图拆分

Path 检查删除图中的边是否会导致图拆分,path,directed-graph,Path,Directed Graph,我有一个图形结构,在这个结构中,我一个接一个地删除边,直到满足某些条件。我的大脑完全停止了,我无法找到一种有效的方法来检测删除一条边是否会导致我的图形分裂为两个或多个图形 bruteforce的解决方案是执行bfs,直到可以从一个随机节点到达所有节点,但对于大型图,这将花费太多时间 有什么想法吗 编辑:经过一点搜索后,我试图做的似乎与fleury算法非常相似,在fleury算法中,我需要查找边是否为“桥”。如何选择要删除的边? 你能谈谈你的问题领域吗 你的图表有多大?也许BFS很好 在你写下你正

我有一个图形结构,在这个结构中,我一个接一个地删除边,直到满足某些条件。我的大脑完全停止了,我无法找到一种有效的方法来检测删除一条边是否会导致我的图形分裂为两个或多个图形

bruteforce的解决方案是执行bfs,直到可以从一个随机节点到达所有节点,但对于大型图,这将花费太多时间

有什么想法吗


编辑:经过一点搜索后,我试图做的似乎与fleury算法非常相似,在fleury算法中,我需要查找边是否为“桥”。

如何选择要删除的边? 你能谈谈你的问题领域吗

你的图表有多大?也许BFS很好

在你写下你正在试图找出一个边缘是否是一座桥之后,我建议 可以按边的介数度量值的降序删除边

本质上,介数是图中边(或顶点)中心度的度量。 中间值越高的边在图中成为桥梁的可能性越大


在web上查找,该算法称为“”。

如果删除顶点A和B之间的链接,您不能检查在删除边缘后是否仍然可以从B到达A吗?这比从一个随机节点访问所有节点要好一点。

删除时使图形断开连接的边称为“”。您可以在O(|V |+|E |)中找到它们,只需对整个图形进行一次深度优先搜索。一个相关的算法会找到所有的“关节点”(如果移除,会使图形断开连接的节点)如下。两个关节点之间的任何边都是桥(您可以在第二次通过所有边时进行测试)

//
//g:图形;v:当前顶点id;
//家长:家长(r/w);r_a:上升(r/w);美联社:艺术。点,布尔阵列(r/w)
//n_v:bfs访问顺序
//
无效dfs_art_i(图*g,int v,int*r_p,int*r_v,int*r_a,int*r_ap,int*n_v){
int i;
r_v[v]=*n_v;
r_a[v]=*n_v;
(*n_v)+;
//printf(“输入%d(nv=%d)\n”,v,*n\u v);
对于(i=0;河流[v]。n_边;i++){
int w=g->顶点[v]。边[i]。目标;
//printf(“\t评估%d->%d:,v,w);
如果(r_v[w]=-1){
//printf(“…\n”);
//这是我们第一次找到这个顶点
r_p[w]=v;
dfs_art_i(g、w、r_p、r_v、r_a、r_ap、n_v);
//printf(“\n\t…返回%d->%d”,v,w);
如果(r_a[w]>=r_v[v]){
//printf(“-a[%d]%d>=v[%d]%d”,w,r_a[w],v,r_v[v]);
//找到连接点
r_ap[i]=1;
}
if(r_a[w]1?1:0;
返回1;
}

为什么要逐个删除边缘?许多算法一个接一个地删除边以完成其他任务。也许有更简单的方法来做你想做的事?
//
// g: graph; v: current vertex id; 
// r_p: parents (r/w); r_a: ascents (r/w); r_ap: art. points, bool array (r/w)
// n_v: bfs order-of-visit 
//
void dfs_art_i(graph *g, int v, int *r_p, int *r_v, int *r_a, int *r_ap, int *n_v) {
    int i;
    r_v[v] = *n_v;
    r_a[v] = *n_v;
    (*n_v) ++;

    // printf("entering %d (nv = %d)\n", v, *n_v);
    for (i=0; i<g->vertices[v].n_edges; i++) {
        int w = g->vertices[v].edges[i].target;
        // printf("\t evaluating %d->%d: ", v, w);
        if (r_v[w] == -1) {    
            // printf("...\n");
            // This is the first time we find this vertex
            r_p[w] = v;
            dfs_art_i(g, w, r_p, r_v, r_a, r_ap, n_v);
            // printf("\n\t ... back in %d->%d", v, w);
            if (r_a[w] >= r_v[v]) {
                // printf(" - a[%d] %d >= v[%d] %d", w, r_a[w], v, r_v[v]);
                // Articulation point found
                r_ap[i] = 1;
            }
            if (r_a[w] < r_a[v]) {
                // printf(" - a[%d] %d < a[%d] %d", w, r_a[w], v, r_a[v]);
                r_a[v] = r_a[w];
            }
            // printf("\n");
        }
        else {
            // printf("back");
            // We have already found this vertex before
            if (r_v[w] < r_a[v]) {
                // printf(" - updating ascent to %d", r_v[w]);
                r_a[v] = r_v[w];
            }
            // printf("\n");
        }
    }
}

int dfs_art(graph *g, int root, int *r_p, int *r_v, int *r_a, int *r_ap) {
    int i, n_visited = 0, n_root_children = 0;
    for (i=0; i<g->n_vertices; i++) {
        r_p[i] = r_v[i] = r_a[i] = -1;
        r_ap[i] = 0;
    }
    dfs_art_i(g, root, r_p, r_v, r_a, r_ap, &n_visitados);    

    // the root can only be an AP if it has more than 1 child
    for (i=0; i<g->n_vertices; i++) {
        if (r_p[i] == root) {
            n_root_children ++;
        }
    }
    r_ap[root] = n_root_children > 1 ? 1 : 0;
    return 1;
}