接続グラフ
概念DFSの[図0.5]事前知識
VIS配列:フィギュアを横断し、多くの場合、ブール値は頂点が訪問されているかどうかVIS記録マーク列に設定されています。しかし、時には、あなたは意味VIS値を変更する必要があります。VISので、値の3種類と、3つの異なる意味を持っています
VIS = 0、そうではない頂点がアクセスされていないことを示し
VIS = 1、それは頂点がすでに訪問されたことを示し、それが終了し、だけでなく、ノーリターンの観点から将来の世代のためにアクセスされていません
VIS = 2、それは、将来の世代へのアクセスが終了した、頂点がアクセスされたことを示し頂点から戻ってきました
値の3種類のVI順序関係や時間的関係で表すことができます。
DFS処理、エッジ用U-> V
= 0、v説明がアクセスされていない、Vが最初に発見されたVIS [V]、U-> Vは木の側としても知られている、分岐側
VIS [V] = 1、v説明は、アクセスされたが、その子孫は、最終アクセスされていない(それが利用可能である)、uとv点ながら?説明のu vは、将来の世代であり、U-> Vは、後方エッジとしても知られているので、後方側、隔世遺伝側
VIS [V] = 2、v説明がアクセスされた、その子孫のすべてへのアクセスが終了した、U-> Vであり得るエッジフォークの横方向縁部、又は前方縁
1.接続無向グラフ
ユニコム:2つはそれらを結ぶ経路が存在します。
ユニコムブロック:二十から二ユニコムの内側の点。
ブリッジは:ユニコム無向グラフの場合、エッジがあれば、ブリッジと通信を除去した後、このエッジは、図になっている場合のみ。
強連結成分:ブロックはユニコムブリッジはありません。
(二重リンクのグラフの非エッジ成分強連結成分と呼ばれる概念がに対応します。
ダブルによって連:ダブルカット連結成分がない点ではありません
特定の対象のための二重通信コンポーネントの動作を図ります。)
tarjanアルゴリズム宣告ブリッジ:
DFN [x]はxが検索するどのような数を表し、DFSのシーケンスです。
(instack [Y])Yサブツリーの点xを表す場合instack [X]スタックDFSにおける現在の点かどうかを示す、先祖返りエッジコードかどうかを決定するために使用されます。
しかしながら無向グラフユニコム成分instackアレイは不要です。
無双方向ので、グラフのすべてのエッジは、ケースの前縁が意味をなさない低い(アウト更新することなく、前縁特殊文にあれば(instack [Y])を使用tarjan)を更新しない(証明する:一つは前に存在する場合エッジU-> V、そしてV-もある> uが、そうDFSをv vに更新されました。再び更新しない場合は、VへのDFSは、意味がありませんでしたとき)ので、
低[X] PPT:非復帰によって、非ツリーエッジDFNによって最小限までX側に到達することができます。
私は理解:非ツリーエッジにより、最大X(すなわち父親の隔世遺伝側に戻らない)最小DFNが到達することができます。
香港の先生は間違い(混合)の感じ隔世遺伝側を定義するには:片手は文字通り彼の父の側に戻るように言い渡されていない現実の中で、その結果、instack正しい判断力を利用して一方のコードに、それは彼の父の側への復帰だと思いました。
void tarjan(int x,int fa) {
instack[x] = 1;
dfn[x] = low[x] = ++tot;
for (auto y : E[x]) {
if (!dfn[y]) {
tarjan(y,x);
low[x] = min(low[x], low[y]);
}
else {
if(y!=fa&&instack[y])low[x] = min(low[x], dfn[y]);
}
}
instack[x] = 0;
}
//-----ppt中的错误代码,没有特判掉指向父亲的返祖边--------------
void tarjan(int x) {
instack[x] = 1;
dfn[x] = low[x] = ++tot;
for (auto y : E[x]) {
if (!dfn[y]) {//树边
tarjan(y);
low[x] = min(low[x], low[y]);
}
else {
if(instack[y])low[x] = min(low[x], dfn[y]);//返祖边,一般指向父亲
}
}
instack[x] = 0;
}
ブリッジ文:低[X] <DFN [X] Yの父親上記点の戻り側への復帰の存在を示すyに別の経路を有するX、Yは、Xへの経路を有しています。(??二重連結成分を形成します)
父親の側に接続されてブリッジの代表は逆に低い[X]> = DFN [X]であります
2.図の接続
強連結成分:任意の2点が互いに到達することができます。
Tarjanのアルゴリズムを行う際に、DFNの発見後Tarjan(X)[X] ==が低い場合には、[x]は、xは⾥⼀強連結成分を構成する残りのすべての点は、スタックを維持するために使用することができるサブメニューのツリーです。
stack<int> S;
void tarjan(int x) {
S.push(x);
instack[x] = 1;
dfn[x] = low[x] = ++tot;
for (auto y : E[x]) {
if (!dfn[y]) {
tarjan(y, x);
low[x] = min(low[x], low[y]);
}
else {
if ( instack[y])low[x] = min(low[x], dfn[y]);
}
}
if (low[x] == dfn[x]) {
while (1) {
int now = S.top();
S.pop();
instack[x] = 0;//把之前没有清零的一次性更新。
/*
染色,统计之类的操作
*/
if (now == x)break;
}
}
}
3.例
0。
質問の意味:
Nの顔、あなたはM(a、b)は、強力なB、CとBというくらいあればB、⽽推移関係、それが、あることを非常に強力な顔を表し、その後、整数Cあまり考え
顔の顔を求めているどのように多くのすべてが非常に悪く感じます
N、M <= 10 ^ 5
実践:
非環式:有向グラフ非環式-エッジの少なくとも1つの点がありません>。あなたはすべてのポイントは、それに接続されているかどうかを確認するために刑を宣告なしの辺のポイントに来るまで、だから、任意のポイントを探してください。
環:場合にそのようなポストのためのリング、強連結されるように、非環式縮合点(より複数のエッジであろう)。
ルーチン:リング(トポロジー)の不存在下でうまくやってタイトル、それはシュリンクリングと考えられています。
1.POJ1236
質問の意味:
有向グラフを考えると、Nポイント、要件:
1)あなたはすべての頂点に到達することができ、これらの頂点から達成するために、少なくともいくつかの頂点を選出します
2)少なくとも頂点から任意の出発を作るために、エッジの数を増やすために、あなたはすべての頂点に到達することができます
アイデア:
ルーチン、SCCのためのTarjanのアルゴリズム、および図建て削減の点によります。だから、質問1、ポイント程度に午後12時00分の数のための新しいフィギュアのために、それが答えです。
質問2のために、答えは最大である(点0、0度ポイントのポイント数)、毎度またはアウト度0点の、それも縁の次に度を解決する必要があるのででも0度の地点まで0点に最適です。
また、最後のSCC一つだけあれば、質問2への回答は0を宣告特別でなければなりません。
ルーチン:ユニコム構成図成分に方法があり:0度は0点で有向グラフの点に接続されています。
図ユニコム無向構成部品の方法度点(葉)1を相互接続します。
2.POJ3177
問題の意味:別の牧草1つの牧場から牧場、ベッシーがn個取りするために、少なくとも2つの別個の経路を必要とします。Mは、任意の2つの牧草地との間の少なくとも2つの独立した経路が存在するように、少なくともルートの新しい数を求め、今の方法です。これは、2つの別個の経路を意味する:パスない共通の辺が、同一の中間頂点を通ります。図の保証は、中国聯通によって与えられています。
アイデア:
二成分通信の同じ側に(すなわち、全く強くエッジのコンポーネントを接続していない)、任意の2点は、少なくとも2つの独立した経路を有するので、全ての点が両面で同一の連結成分は、単一の点として見ることができる、到達することができます。
絵がユニコムされているので、日常ポイント還元後、新しいマップは、木です。ビスユニコム成分側を凝縮のすべてのポイントように、今、木の側に追加されます。
その後もルーチンを抜ける、答えは/ 2(ポイント1 +1の木のため)です。
3. HDU3394
質問の意味:スポットが道路を構築するために、管理者メートル公園計画は、nと公園があり、ツアールートのいくつかのために配置してループを形成します。道路は公道とよりであれば、この道は競合であり、1はどのような方法でループでない場合、この道は競合ではありません。競合があると競合がある方法はありませんどのように多くのパスを尋ねます
アイデア:
それは任意の回路ではないので、まず、非望ましくない副作用は、明らかに橋です。
次いで競合側縁が共通の複数の回路であれば、ここで注意は、単純なループ回路、点BCC図建設考え集光点である点を特徴とすべてのBCCは、少なくとも二つの環点におけるエッジの数よりも大きいです側は、紛争の側面です。エッジの数、1つだけの大きなリングに等しい点の数が、競合が変更されていない場合、及び点の辺の数よりも少ないBCC点の場合には存在しません。