そこ理解その図の集光点tarjan--のアルゴリズム

 

  Tarjanは、学ぶために始めて、関連する無向グラフカットポイント、ブリッジ、二国間の二ポイント還元ポイントが不明確有向グラフ点削減事業を除いて、理解することは比較的容易です。luoguP2656_はキノコが問題を解決選ぶことによって、一般的にtarjanアルゴリズムの正しさを見つけます。

  まずくびれポイントtarjanの書き込み機能を図でリリース:

  1. tarjanのボイド(あなたと){  
  2.     DFN [U] =低[U] = ++タイマー。  
  3.     STA [++ STP] = U、イン[U]は=  真。  
  4. (用{; iはi =エッジ[I] .nxt [U] I =ヘッドINT)  
  5. int型V =エッジ[I] .TO。  
  6. (もし!DFN [V]){  
  7.             Tarjan(V);  
  8.             低[U] =分(低[U]、[V]低いです)。  
  9.         }  そう  であれば(INS [V])   
  10.             低[U] =分(低[U]、DFN [V])。  
  11.     }  
  12. //////////////分割ライン////////////////
  13. IF(DFN [U] ==低[U]){  
  14.         ++ CNT;  
  15. int型のx;  
  16. 行う {  
  17.             X =は[stp--]です。  
  18.             C [X] = CNT。  
  19.             イン[X] =  偽。  

        }  (X = U!)一方、  

  1.     }  
  2. }  

  主な問題は、関数の第二部に位置しています。すべてのエッジを通過した後にU点、まず、なぜ(DFN [U] ==低[U])強い通信決意条件の構成成分として?第二に、なぜ今uが強連結成分を構成することができるポイントを通過した後、スタックに残っていますか?

  私たちは、最初の強連結成分の特性を考慮してください。図の番号にセットポイントに設定したときは、強くは、図の部分を満たす場合にのみ、接続され、任意の2つのU、Vインターワーキング。この機能を有すると考えるやすい典型的な構造はまた、環を有し、実際には、(知覚的に)最も簡単なリング強連結グラフ、および任意の強連結成分は、単にリングインターワーキング複数として理解することができますこれは、構成しました。これは非常に重要な考え方です。私は、強連結成分が複合リングを容易に、より正確にtarjanアルゴリズムで記述することができることを理解すべきである簡素化と信じています。

  今、私たちは、問題を説明するための2つの簡単な概略図です。

 

上記のように、最も単純なリングの場合を示す図、uが現在tarjan機能の出発点です。我々は最初の再帰的に、B、Cのスタックではなく、自分自身よりも、その上のU点に3点の低い値を発見しました。条件のtarjanアルゴリズム推敲([U] ==低[U] DFN)である:Uは、強連結成分の「ルート」を、この条件を満たし、他の言葉で、Uは、サブツリーのルートであり、一緒になって検索強連結成分。そこで、我々はこの結論の正しさがある観察します。

タイムスタンプiは点jを満たす点よりも大きい場合に1、サブツリーの2点のために、私は明白である「前方側」(検索側面)による点j、と通信することができるであろう。

2、なぜ、J点あなたはそれのポイントにアクセスすることができますか?これは、(DFN [U] ==低[U])の原点決意条件です。当然、J点は、Uの一方の側は、Uおよび根からは、前縁に沿った任意の点Iに到達するために、そのポイントを介して最後の点cに戻してもよいです。

  同時に、我々は、根本的な原因であるUに説明することができます:私たちは脳cでエッジを作る場合 - >その後、A、その後、B、3が強く接続されているC、しかしUとの接続を強く通信部と、この3の組は、(最大)強連結成分ではなく、構築することができない「ルート」。Uをルートとするサブツリーがないバックスタック内のより高い点に依然としてあり、uのみ到達可能である場合は逆に、このコンポーネントは完了していなければなりません。

  图二为子树含两个环的情况,可以认为是更复杂的强连通分量结构。依然,对子树中任意一点v都可以返回到u,然后到达分量中的任意一点,则两个环共同与u构成强连通分量。实际上,任意的强连通结构都符合这个特征,我们总能沿着某条路径回到根,然后到达任意点,而这正是强连通分量的定义。

 

  最后,联想到维护栈的意义:若某些点已经被遍历过而不在栈中,则其参与构成的强连通分量必然已达到最大,不可能与栈中剩余点强连通。典型的例子是横叉边:由当前点可以回到上一个强连通分量中,而那个分量却不存在边能到达当前点,否则这个点早就在那个分量中就被前向边遍历过了。而对于子树中已经弹出的点,一定是各自构成了较小的强连通分量:因为一定存在某个子节点v,使得(dfn[v] == low[v]),即其子树不能回溯到更广的分量范围中。

  可能写得有些啰嗦,不太好明白(只有我自己知道我在说什么),所以欢迎有问题或者其他想法的同学在评论区交流。

 

おすすめ

転載: www.cnblogs.com/TY02/p/11110656.html