隣接リスト[] [] 2011パーティションツリーDPリーグのシミュレーションの質問の電子の目

説明

中山市、石美しい環境と小都市の快適な気候。市内の交通がビジー状態ではないので、市内の道路網は非常にまばらです。むしろ、中山の都市 N - 1 N-1 Tiao道路と N N 接合部は、それぞれが最もつのみ各道路間の2つの交点のうち、2つの道路ジャンクションに接続されています。交通網として、それは明らかにアップごとに二つの接点の間です。より良い中山市でトラフィックを管理するためには、市長は、任意の時点で道路状況を監視するために、いくつかの交差点では、電子の目をインストールすることにしました。道路の交差点に設置し、これらの電子の目には、この交差点に接続されているすべてを監視することができます。今、市長は、すべての道路を監視する電子の目をインストールするために、交差点の最小必要数を知りたいです。市長は上でコンパイルされているすべての接合部を入れています 1 N 1〜N 番号。
あなたの中山市のマップを与える、あなたは私を助けることができますか?

入力

入力ファイルTraffic.inディジタル回線を含む1 N 1 < = N < = 100000 N(1 <= N <= 100000) 、それは中山市の交差点を表しています。 N - 1 N-1 2つの数の行 バツ X_I Y_I 記述するために使用 N - 1 N-1 接続された2つの道路のジャンクションの数。

出力

出力は、電子の目を取り付けるの最小数が必要です。

サンプル入力

3
1 2
1 3

サンプル出力

1

データ規模
30% N < = 100 N <= 100
50% N < = 1000年 N <= 1000
100% N < = 100000 N <= 100000


問題解決のためのアイデア

最大、チューニング1時間に始まり、ラベル分。WOC

まず、質問を押し、無パーティのボス(忍耐は、私は本当に考えを書きたくない、この質問を読むためにしてください)
セット F [ R インクルード インクルード トン ] [ 1 ] F [ルート] [1] ルート接合の電子眼の最適値を意味
  F [ R インクルード インクルード トン ] [ 0 ] F [ルート] [0] 第1ルートスタッフのための最適値は、電子眼をインストールしません

  • 現在の電子アイクロッシングがインストールされ、それに接続された接合部を取り付けることができ、次に、インストールされていない場合
    f [ r o o t ] [ 1 ] + = m i n ( f [ a [ i ] . t o ] [ 0 ] , f [ a [ i ] . t o ] [ 1 ] ) F [ルート] [1] + =分(F [i]が.TO] [0]、F [i]が.TO] [1])
  • 現在の交差点は、電子目にインストールされていない場合、交点がインストールされ、それに接続する必要があり、次いで
    f [ r o o t ] [ 0 ] + = f [ a [ i ] . t o ] [ 1 ] F [ルート] [0] + = F [i]が.TO] [1]

この問題は双方向であるため、あなたがまっすぐ行けば、そう、あなたはサイクル、バーストスタックを死にます。配列と t トン 、交差点をマーキングすることは来ませんでした。


#include<iostream>
#include<cstdio>
using namespace std;
struct DT{
	int to;
	int next;
}a[200200];
int b[100100],n,num,f[100100][2],Gun=100100,t[100100];
void DP(int root){
    f[root][1]=1;//初值
    t[root]=1;//标记
	for(int i=b[root];i;i=a[i].next){
		if(!t[a[i].to]){
			DP(a[i].to);
			f[root][1]+=min(f[a[i].to][0],f[a[i].to][1]);//装	
     		f[root][0]+=f[a[i].to][1];//不装
		}
	}
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<n;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		a[++num].to=y;
		a[num].next=b[x];
		b[x]=num;
		a[++num].to=x;
		a[num].next=b[y];
		b[y]=num;//无向图,存两条边
	}
	DP(1);
	Gun=min(f[1][1],f[1][0]);//这个Gun好像没用(???)
	printf("%d",Gun);
} 
公開された45元の記事 ウォンの賞賛0 ビュー364

おすすめ

転載: blog.csdn.net/qq_39940018/article/details/103536218