[ツリーDP] [Tarjan】小さなCの4316独立集合Bzoj

説明

グラフ理論C星の王子さま小さな子供の食べ物が多い、特にグラフ理論の観点から、多くの場合、小さな子供惨めひどくD。
何図に複数の点を選択し、お互いにこれらの点を結ぶないエッジ、および可能なポイントな限り除去:小小C Dは、非有向グラフの最大独立集合を求めないように単純にするように、これはありません。
小さなDグラフ理論が弱いだけでなく、無向グラフの最大独立集合のNPCである知っているが、それは一種の小さなCは非常に特徴が得られたものの:属し、単純なリングに属する任意のエッジで図を、図無ヘビーエッジとループバック。Cは、水を言うために、比較的小さいであろう。
小Dは、このトピックはあなたの上で、非常に興味深いと思い、私はあなたが溶液から出てくることができるようになりますと信じています。

 

問題の解決策

  • 取得するにはサボテンのアプローチを使用することを検討してください、我々はアウト構築するサークルの木を二乗することはできません
  • Tarjanは、[i]は[0/1] iは現在のポイントが選択されていないか、または選択されたサブツリーは、iが最大独立集合であることを示し、直接提供Fを行います
  • そして、ほとんどのように行われる一般的な木のDPは分けて考えるリングを実施することと等価である転送

 

コード

1の#include <cstdioを>
 2の#include <iostreamの>
 3  の#define N 60010
 4  使って 名前空間STD。
5  構造体の縁{ INTに、から ;} E [N * 3 ]。
6  INTの N、M、CNT = 1、Faを[N]、F [N] [ 2 ]、DFN [N]、低[N]、ヘッド[N]。
7  ボイド挿入(int型のx、int型のy)の
 8  {
 9      E [++ CNT] .TO = Y、E [CNT]。ヘッド[X]、ヘッド[X] = = CNT。
10      = Xの.TO E [++ CNT]、E [CNT]。ヘッド[Y]、ヘッド[Y] = = CNT。
11  }
 12  空隙 DP(int型のx、int型のY)
 13  {
 14      のint F0 R0、R1、= 0、F1 = 0 15      のためにint型 [I] [F R0 = F0を+; I = X!I = Faを[i]はiは= y)を0 [i]が[F]、R1 =のF1 + 1 ]、F0 = MAX(R0、 R1)、F1 = R0。
16      F [X] [ 0 ] + = F0、F0 = 0、F1 = - 1E9。
17      のためにint型 = I yは、iが= X;!私= Faを[I])R0 = F0 + F [i]が[ 0 ]、R1は= F1 + F [i]が[ 1]、F0 = MAX(R0、R1)、F1 = R0。
18      F [X] [ 1 ] + = F1。
19  }
 20の 空隙 DFS(int型のx、int型FA)
 21  {
 22の      DFN [X] =低[X] = ++ DFN [ 0 ]、F [X] [ 1 ] = 1、F [X] [ 0 ] = 0・FA [X] = FA。
23      のためには、int型 ; I I = E [i]は、I =ヘッド[X]。から24      {
 25          であれば、(DFN [E [I] .TO]!)DFS(E [I] .TO、X)低[X] =分(低[x]は、低[E [i]の.TO])。それ以外の 場合(!E [i]は.TO = FA)低[X] = 分(低[x]は、DFN [E [i]の.TO])。
26          であれば(低[E [i]は.TO]> DFN [X])F [X] [ 1 ] + = F [E [I] .TO] [ 0 ]、F [x]は[ 0 ] + =最大(F [E [I] .TO] [ 0 ]、F [E [I] .TO] [ 1 ])。
27      }
 28      のためのint型 I =ヘッド[X]; I; I = E [I] からもし!(FA [E [i]は.TO] = X && DFN [X] < DFN [E [I] .TOを])、DP(X、E [I] .TO)。
29  }
 30  のint main()の
 31  {
 32      のscanf(" %D%dの"、&​​N、&M)。
33      のためのint型 I = 1、X、Y、I <= M; iは++)のscanf(" %d個の%のD "、およびX&Y)を、(x、y)を挿入します。
34の      DFS(10)、のprintf(" %dの"、MAX(F [ 1 ] [ 0 ]、F [ 1 ] [ 1 ]))。
35 }

 

おすすめ

転載: www.cnblogs.com/Comfortable/p/11367371.html