説明
中山市、石美しい環境と小都市の快適な気候。市内の交通がビジー状態ではないので、市内の道路網は非常にまばらです。むしろ、中山の都市
Tiao道路と
接合部は、それぞれが最もつのみ各道路間の2つの交点のうち、2つの道路ジャンクションに接続されています。交通網として、それは明らかにアップごとに二つの接点の間です。より良い中山市でトラフィックを管理するためには、市長は、任意の時点で道路状況を監視するために、いくつかの交差点では、電子の目をインストールすることにしました。道路の交差点に設置し、これらの電子の目には、この交差点に接続されているすべてを監視することができます。今、市長は、すべての道路を監視する電子の目をインストールするために、交差点の最小必要数を知りたいです。市長は上でコンパイルされているすべての接合部を入れています
番号。
あなたの中山市のマップを与える、あなたは私を助けることができますか?
入力
入力ファイルTraffic.inディジタル回線を含む1 、それは中山市の交差点を表しています。次 2つの数の行 と 記述するために使用 接続された2つの道路のジャンクションの数。
出力
出力は、電子の目を取り付けるの最小数が必要です。
サンプル入力
3
1 2
1 3
サンプル出力
1
データ規模:
30%
50%
100%
問題解決のためのアイデア
最大、チューニング1時間に始まり、ラベル分。。。WOC
まず、質問を押し、無パーティのボス(忍耐は、私は本当に考えを書きたくない、この質問を読むためにしてください)
セット
ルート接合の電子眼の最適値を意味
第1ルートスタッフのための最適値は、電子眼をインストールしません
- 現在の電子アイクロッシングがインストールされ、それに接続された接合部を取り付けることができ、次に、インストールされていない場合
- 現在の交差点は、電子目にインストールされていない場合、交点がインストールされ、それに接続する必要があり、次いで
この問題は双方向であるため、あなたがまっすぐ行けば、そう、あなたはサイクル、バーストスタックを死にます。配列と 、交差点をマーキングすることは来ませんでした。
#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);
}