POJ 1523 SPF 割点与桥的判断算法-Tarjan

题目链接:

POJ1523







题意:

问一个连通的网络中有多少个关节点,这些关节点分别能把网络分成几部分



题解:

Tarjan 算法模板题


顺序遍历整个图,可以得到一棵生成树:

树边:可理解为在DFS过程中访问未访问节点时所经过的边,也称为父子边

回边:可理解为在DFS过程中遇到已访问节点时所经过的边,也称为返祖边、后向边

对根节点u,若其有两棵或两棵以上的子树,则该根结点u为割点;

对非叶子节点u(非根节点),若其子树的节点均没有指向u的祖先节点的回边,说明删除u之后,根结点与u的子树的节点不再连通;则节点u为割点。


// 当(u,v)为树边且low[v]>dfn[u]时,表示v节点只能通过该边(u,v)与u连通,那么(u,v)即为割边。

用一个数组保存每个节点的子树个数即可



代码:

#include
#include
#include
#include
#define maxn 1050
using namespace std;
int dfn[maxn],low[maxn];          //dfs序  和子树连接的最小节点
int vis[maxn];
vectoredge[maxn];   
int child[maxn];
int num,son;
void init()
{
    memset(vis,0,sizeof(vis));
    memset(child,0,sizeof(child));
    vis[1]=1;
    num=0;
    son=0;
}
void Tarjan(int u)
{
    dfn[u]=low[u]=++num;
    vis[u]=1;
    for(int i=0; i1)
            cout<0)
            {
                flag=0;
                printf("  SPF node %d leaves %d subnets\n",i,child[i]+1);
            }
        if(flag)
            cout<<"  No SPF nodes"<


你可能感兴趣的:(├──连通性,算法,▼图论,搜索)