算法学习之 图的割点

原创 2016年08月29日 23:23:52

一.图的割点

先解释一下什么叫图的割点吧,割点就是如果去掉这个点之后无法实现所有点的相互连通,那么这个点就是割点。

二.寻找图的割点

那么给定一张图怎么找到图的割点呢,当然了,所谓割点当然应该是一个图里只有一个强联通分量吧,那么说一下我们大致的算法,我们判断一个节点u是否是割点,就是判读他的子节点中是否存在节点不经过这个节点就无法回到祖先,如果是这样的,那么这个节点就是割点。我们用dfn[u]来记录访问到u的时间戳,low[u]来记录u节点在不经过其父节点所能访问到的最早时间戳(就是第一个能够访问到的祖先节点编号),有了这两个数据,那么根据我们上面的算法我们知道如果low[i]>=num[cur](i是cur的子节点),那么也就是说i没法回到祖先,所以说cur应该是割点

三.数据

n个点m个边,无向图

6 7

1 3

1 4

4 2

3 2

2 5

2 6

5 6

//
//  main.cpp
//  图的割点
//
//  Created by 张嘉韬 on 16/8/29.
//  Copyright © 2016年 张嘉韬. All rights reserved.
//

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn=1000;
int min(int a,int b)
{
    if(a<b) return a;
    else return b;
}
int map[maxn][maxn],n,m,x,y,root,flag[maxn],indx,num[maxn],low[maxn];
void dfs(int cur,int father)
{
    int child=0;
    indx++;
    num[cur]=indx;
    low[cur]=indx;
    for(int i=1;i<=n;i++)
    {
        if(map[cur][i]==1)
        {
            if(!num[i])
            {
                dfs(i,cur);// 子节点就去dfs()
                low[cur]=min(low[cur],low[i]);
                if(cur!=root&&low[i]>=num[cur]) flag[cur]=1;
                if(cur==root&&child==2) flag[cur]=1;//虽然未遍历完但是如果有两个两个子节点了那么一定就是割点。
            }
            else if(num[i]&&i!=father)
                low[cur]=min(num[i],low[cur]);
        }
    }
}
int main(int argc, const char * argv[]) {
    freopen("/Users/zhangjiatao/Documents/暑期训练/input.txt","r",stdin);
    memset(map,0,sizeof(map));
    memset(flag,0,sizeof(flag));
    memset(num,0,sizeof(num));
    memset(low,0,sizeof(low));
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&x,&y);
        map[x][y]=1;
        map[y][x]=1;
    }
    root=1;
    indx=0;
    dfs(1,root);
    for(int i=1;i<=n;i++) cout<<num[i]<<" ";
    cout<<endl;
    for(int i=1;i<=n;i++) cout<<low[i]<<" ";
    cout<<endl;
    for(int i=1;i<=n;i++)
        if(flag[i]) printf("%d\n",i);
    return 0;
}




版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

基于DFS求无向图的割点及桥(割边)算法总结 POJ_1144题解

1.割点,桥(割边)定义: 若v2(v1的后继节点)有且仅有反向边最远连接到v1,那么删除v1后不连通,v1是割点。作为一种特殊情况,如果v2及其后代通过反向边只能连回v2自己,那么只要删除edge...

用Tarjan算法求无向连通图割点&&割边

/** 割点割边挺好理解的,割点就是一个无向连通图,把其中一个点 挖掉剩下的图不连通,割边就是把一条边砍掉不连通 比如:有一个通信网络,要求一颗炸弹,把这个通信网络搞得不连通...
  • zcube
  • zcube
  • 2015-09-05 10:11
  • 1984

Tarjan算法求无向图割边割点、最近公共祖先的总结

无向图tarjan求割边割点、最近公共祖先总结 割点:删除这个点之后整个图变成不连通的两个部分的点 割点集合:在一个无向图中删除该集合中的所有点,能使原图变成互不相连的连通块的点的集合 点连通度...
  • MrH929
  • MrH929
  • 2016-07-19 19:49
  • 1020

算法学习——求割点与桥的tarjan算法 HDU4738

前天打周赛做到 HDU4738  绞尽脑汁都没想到用什么好的方法来解决这个问题   周赛结束之后跟Yasola和xcy讨论了一下居然用到  tarjan算法   exm???  tarjan不是用来求...

图的割点算法vs图的割边算法

图的割点 在一个无向连通图中,如果删除某个顶点后,图不再连通(即任意两点之间不能相互到达),我们称这样的顶点为割点(或者称割顶)。 上图中的2号顶点就是割点,因为删除2号后,4,5不通,1...

UOJ#67 新年的毒瘤(Tarjan算法求割点)

Tarjan算法求无向图的割点
  • setio
  • setio
  • 2015-08-19 23:29
  • 325

POJ1523_SPF_求割点与分块_tarjan算法

题意: 给一个无向图,求其中的割点,并求当此割点删掉后图中形成多少个连通分量 题解: 用tarjan求割点:伪代码 求割点的方法就用上面的,d[u]和low[u]的含义是: d[u],dfs到结点u...

POJ1523 SPF 求割点及连通块数 tarjin算法

/* 题目地址:http://poj.org/problem?id=1523 题意:给你一个关系网,求其中的关节点——去掉该点后一个连通的分块变成两个或 两个以上。 题中点的出现次序混乱,并且...

Tarjan算法求桥和割点

预备定义: low[u]定义为u或者u的子树中能够通过非父子边追溯到的最早的节点的DFS开始时间 d[u]表示dfs过程中u的进栈时间 割点:无向连通图中,如果删除某点后,图变成不连通,则称该点为割点...

【tarjan算法求割点】PKU-1523-SPF

其实题目的数据不够规范,因为它的点可能不连续,而且数据里面一定有根节点1,这个在题目里体现不了! 题目 #include #include #include #include #include u...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)