爆撃(爆弾):tarjan、トポロジカル整列

試験問題間違った上で、何も言うこと。

しかし、それは大きなボードです。

髪の説明はかろうじて見ることができます。しかし、私はまだ話をしたいと思います。

Bの場合は、直接または間接的にから発現対象、それができない、同時にAおよびB爆撃

だから我々はちょうど有向パスの図から引き出さ、このパスは任意AB、その後のいずれかからBまたはBからAへの2点を選びます

そして、あなたは2点のいずれかの選択同じポイントだけではない、あなたが同じ時間を爆撃することはできません。

彼はどのような使用のセクションがそれであることを強調しましたか?その正しさは明らかです。

私は、追加の制限を追加していない、それは、環、聖歌を発生する可能性があり、同じポイントで数周を回すこと「にする経路がある」と述べました。

私たちは、シンプルなリングを検討してください。そして、毎回それは上の揚げする必要があります。

パス上の各点はまた別の爆撃を必要とし、簡単なパスを考えてみましょう。

ループへのパス場合、この点は、(環上の任意の点に到達する経路上の点)揚げ別個以上でなければなりません。

リングはパスにつながる場合には、リング上の点もパスに、個別に揚げています。

要約すると、それは可能な限り上記の点から別のパスを見つけることです、異なる点の数が答えです。

1を高めるために、リングの経路長上の各点を、との接続には影響しません:既にその意味を含んでいる言葉の束以上。

そう終了強いリンクリング後tarjan凝縮成分を考慮したが、大ドットに環は、環内の点の数だけの重量に等しいです。

1の残りの通常の右のポイント値。質問は今右のポイントにして最大値を超えることにDAG内のパスを見つけることになります。

ないDFSではなく、リングではなく、木は、それは非常に病気に成長することができますが、それは、DAG向けられているので。

この嫌な内部実行DFSのビューでは、廃棄物の多くは、以下の3と3点リードの後に​​繰り返されます。

検索は後方何かのメモリを追加することができますが、トポロジカルソートの方が便利だろう。

1つの#include <ビット/ STDC ++ H>
 2  使用して 名前空間STDを、
3地図< INTINT > MM。
4  int型 N、M、FIR [ 1000005 ]はL [ 1000005に]、[ 1000005 ]、CNT = 1、[DFN 1000005 ]、低[ 1000005 ]。
5  int型 _fir [ 1000005 ]、_ Lの[ 1000005 ]、_に[ 1000005 ]、_ CNT、W [ 1000005 ]  [ 1000005 ]。
6  int型のSTA [ 1000005]、イン[ 1000005 ]、ティム、上部、BL [ 1000005 ]、cnt_scc、ANS、DIS [ 1000005 ]。
7  INTの Q [ 1000005 ]、T。
8  ボイド(接続int型int型 B){1- [++ CNT] =モミ[A];モミ[A] = CNT; [CNT] =のB;}
 9  ボイド _connect(int型int型 B){_ L 【++ _ CNT] = _モミ[A]; _モミ[A] = _ CNT; _cnt] = B _to。[B] ++ ;}
 10 空隙 tarjan(int型P){
 11の      DFN [P] =低[P] = ++ティム; STA [++トップ] = P;イン[P] = 1 12 のために      int型 I = FIR [P]; I; I =のL [i])と
 13          であれば、[I])、ロー[P] =まで(DFN [する[I])tarjan(!分(低[P]、低)[i]を[します]。
14          他の 場合(INS [する[I])低[P] = 分(低[P]、[I]に低)
15      であれば(DFN [P] == 低[P]){
 16          [++ cnt_scc] ++ W 17          ながら(!STA [トップ] = P)イン[STA [トップ] = 0、BL [STA [トップ- ] = cnt_scc、W [cnt_scc] ++ ;
18          トップ- ; BL [P] = cnt_scc;イン[P] = 0 ;
19      }
 20  }
 21は、 メイン(){符号付き
 22      のscanf(" %D%Dを"&N、& M);
 23      のためにint型 I = 1、A、B、I <= M; ++ I)のscanf(" %d個の%のD "、&​​、&B)、接続(b)は;
 24      のためのint型 i = 1 ; iが<= N I ++)場合(!tarjan(I)[I]をDFN);
 25      のためのint型 i = 1 ; iが<= N; I ++)のためにint型 J = FIR [I]; J; Jは=のL [J])
 26          であれば(BL [I] =用!BL)_接続(BL [I]、[J]に] BL)[J]に]。
 27      のためのint型 I = 1; I <= cnt_scc; ++ I)の場合(! [I])Q [++ T] = I。
28      のためにINT H = 1 ; H <= T; ++ H){
 29          INT DT = DIS [Q [H] + W [Q [H]; ANS = MAX(ANS、DT)。
30          のためにint型 I = _fir [Q [H]; I; I = _L [I]){
 31              における [[i]を_to] - ; DIS [_to [I] = I [_to MAX(DISを[ ]、DT)。
32              であれば(! Q [++ T] = [_to [I])[i]は_to。
33          }
 34      }
 35      のprintf(" %d個の\ n " 、ANS)。
36 }
実際には、コードサイズは大きくありません

 

おすすめ

転載: www.cnblogs.com/hzoi-DeepinC/p/11328385.html