テンプレート - 強連結成分/カットポイント/ブリッジ - Tarjan

int dfn[N], low[N], dfncnt, s[N], tp;
int scc[N], sc;  // 结点 i 所在 scc 的编号
int sz[N];       // 强连通 i 的大小
void tarjan(int u) {
    low[u] = dfn[u] = ++dfncnt, s[++tp] = u;
    for(int i = h[u]; i; i = e[i].nex) {
        const int &v = e[i].t;
        if(!dfn[v])
            tarjan(v), low[u] = min(low[u], low[v]);
        else if(!scc[v])
            low[u] = min(low[u], dfn[v]);
    }
    if(dfn[u] == low[u]) {
        ++sc;
        while(s[tp] != u)
            scc[s[tp]] = sc, sz[sc]++, --tp;
        scc[s[tp]] = sc, sz[sc]++, --tp;
    }
}

カットポイント:
、カット点の判定は、ルートノードのために容易ではない-二つ以上のサブツリーすなわち、そのカット場合、そのサブツリーを計算します。あなたは二つのサブ木がお互いに達することができないこの点を、削除する場合ので。
非ルートノードの場合、ポイントはいくつかの問題をカット判断することではありません。我々は、uはuが頂点とサブツリーを表すロー(最初の)アクセス、[U]であることが、いくつかの最初の頂点を表し、[]、DFN [U] [] DFNおよび低二つの配列を維持し、背面側が、戻ることができ(接続エッジUを介してではなく、親ノード)最初の点(DFN最小)値DFNします。エッジに対して(U、V)、低[V]> =のDFN [あれば U]、 Uは、この時点で切断されます。

現在の頂点U、低いデフォルトを仮定[U] =のDFN [U ]、 バック自体に、すなわち、最初。
Vが訪問していない場合にエッジが存在する(u、v)は、その後、引き続きDFS、DFSを終了、低[U] =分(低[U]、低い[V]);
vは(およびuの代わりにVで訪問した場合父)、DFSを継続する必要がない、そこDFNしなければならない[V] <DFN [U ]、低[U]は=分(低[U]、DFN [V])。

U == FA平均U ==のROOT以下、彼がFAに合格したいと思います

void tarjan (int u,int fa)
{
    DFN[u]=LOW[u]=++idx;
    int child=0;
    for (int i=head[u];i!=0;i=pre[i].mark)
    {
        int nx=pre[i].nxt;
        if (!DFN[nx])
        {
            tarjan (nx,fa);
            LOW[u]=min (LOW[u],LOW[nx]);
            if (LOW[nx]>=DFN[u]&&u!=fa)
                cut[u]=1;
            if(u==fa)
                child++;
        }
        LOW[u]=min (LOW[u],DFN[nx]);
    }
    if (child>=2&&u==fa)
        cut[u]=1;
}

 for (int i=1;i<=n;i++)
        if (DFN[i]==0)
            tarjan (i,i);
    for (int i=1;i<=n;i++)
        if (cut[i])
            tot++;

最先端:

そして、ほとんどのカットポイント、また、切断ブリッジと呼ばれます。
無向グラフのために、コンポーネント接続されたエッジの数が増加した場合、削除、ブリッジはこのエッジ又は刃先に言われています。
実現
とカットポイントはほぼ限り変更:(V)> DFN(低い U) その上に、問題の根本を検討する必要はありません。

最先端ことで、問題の根はありませんが、我々は時間のオリジナルカットポイントバック(親を含む)祖先の親ノードであり、頂点はuはポイントをカットするのV Uの指導なしには不可能である見つけます。ロー(V)== DFN(U)しない頂点v祖先は、その後、別のものに戻って彼の父の道に戻らなかった場合にも、ノードが表す親に戻ることができる(u、v)はこの側である刃先場合。

おすすめ

転載: www.cnblogs.com/Yinku/p/11361532.html