1. 程式人生 > >洛谷mNOIP模擬賽Day2-將軍令

洛谷mNOIP模擬賽Day2-將軍令

數學 pan noip 至少 queue bsp 沒有 == cstring

題目背景

pdf題面和大樣例鏈接:http://pan.baidu.com/s/1cawM7c 密碼:xgxv

 歷史/落在/贏家/之手 
 至少/我們/擁有/傳說 
 誰說/敗者/無法/不朽 
 拳頭/只能/讓人/低頭 
 念頭/卻能/讓人/擡頭 
 擡頭/去看/去愛/去追 
 你心中的夢   

題目描述

又想起了四月。

如果不是省選,大家大概不會這麽輕易地分道揚鑣吧? 只見一個又一個昔日的隊友離開了機房。

憑君莫話封侯事,一將功成萬骨枯。

夢裏,小 F 成了一個給將軍送密信的信使。

現在,有兩封關乎國家生死的密信需要送到前線大將軍帳下,路途兇險,時間緊迫。小 F 不因為自己的禍福而避趨之,勇敢地承擔了這個任務。

不過,小 F 實在是太粗心了,他一不小心把兩封密信中的一封給弄掉了。

小 F 偷偷打開了剩下的那封密信。他 發現一副十分詳細的地圖,以及幾句批文——原來 這是戰場周圍的情報地圖。他仔細看後發現,在這張地圖上標記了 n 個從 1 到 n 標號的 驛站,n ? 1 條長度為 1 裏的小道,每條小道雙向連接兩個不同的驛站,並且驛站之間可以 通過小道兩兩可達。

小 F 仔細辨認著上面的批註,突然明白了丟失的信的內容了。原來,每個驛站都可以駐 紮一個小隊,每個小隊可以控制距離不超過 k 裏的驛站。如果有驛站沒被控制,就容易產 生危險——因此這種情況應該完全避免。而那封丟失的密信裏,就裝著朝廷數學重臣留下的 精妙的排布方案,也就是用了最少的小隊來控制所有驛站。

小 F 知道,如果能計算出最優方案的話,也許他就能夠將功贖過,免於死罪。他找到了 你,你能幫幫他嗎? 當然,小 F 在等待你的支援的過程中,也許已經從圖上觀察出了一些可能會比較有用的 性質,他會通過一種特殊的方式告訴你。

輸入輸出格式

輸入格式:

從標準輸入中讀入數據。

輸入第 1 行一個正整數 n,k,t,代表驛站數,一支小隊能夠控制的最遠距離,以及特 殊性質所代表的編號。關於特殊性質請參照數據範圍。

輸入第 2 行至第 n 行,每行兩個正整數 u_iui?,v_ivi?,表示在 u_iui?v_ivi? 間,有一條長度為 一裏的小道。

輸出格式:

輸出到標準輸出中。

輸出一行,為最優方案下需要的小隊數。

輸入輸出樣例

輸入樣例#1: 復制
4 1 0 
1 2 
1 3 
1 4
輸出樣例#1: 復制
1 
 
輸入樣例#2: 復制
6 1 0 
1 2 
1 3 
1 4 
4 5 
4 6
輸出樣例#2: 復制
2 

說明

【樣例 1 說明】

如圖。由於一號節點到周圍的點距離均是 1,因此可以控制所有驛站。

【樣例 2 說明】

如圖,和樣例 1 類似。

技術分享

子任務會給出部分測試數據的特點。如果你在解決題目中遇到了困難,可以嘗試只解 決一部分測試數據。

關於 t 的含義如下: t = 0:該測試點沒有額外的特殊性質; t = 1:保證最多 8 個點的所連接的小道超過 1 條; t = 2:保證所有點到 1 號點的距離不超過 2。

每個測試點的數據規模及特點如下表

技術分享


貪心,對於深度最深的未處理節點來說,反正它都最深了,那麽盡量選淺一點的吧 註意樹上問題不僅有父親,兒子,還有兄弟啊啊啊~!!!
 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<map>
 7 #include<set>
 8 #include<queue>
 9 #include<vector>
10 #define INF 0x7f7f7f7f
11 #define pii pair<int,int>
12 #define ll long long
13 #define MAXN 100005
14 using namespace std;
15 int read(){
16     int x=0,f=1;char ch=getchar();
17     while(ch<0||ch>9){if(-==ch)f=-1;ch=getchar();}
18     while(ch>=0&&ch<=9){x=x*10+ch-0;ch=getchar();}
19     return x*f;
20 }
21 int n,k;
22 int first[MAXN],nxt[MAXN<<1],to[MAXN<<1],cnt;
23 //double edge
24 int dep[MAXN],fa[MAXN];
25 pii tmp[MAXN];
26 int b[MAXN];
27 
28 void add(int x,int y){
29     nxt[++cnt]=first[x];first[x]=cnt;to[cnt]=y;
30     nxt[++cnt]=first[y];first[y]=cnt;to[cnt]=x;
31 }
32 void dfs(int x){
33     for(int e=first[x];e;e=nxt[e]){
34         int y=to[e];
35         if(y==fa[x]){
36             continue;
37         }
38         fa[y]=x;
39         dep[y]=dep[x]+1;
40         dfs(y);
41     }
42 }
43 void solve(int x,int fa,int d){
44     if(!d){
45         return ;
46     }
47     for(int e=first[x];e;e=nxt[e]){
48         int y=to[e];
49         if(y==fa){
50             continue;
51         }
52         b[y]=1;
53         solve(y,x,d-1);
54     }
55 }
56 bool comp(const pii &p1,const pii &p2){
57     return (p1.first>p2.first);
58 }
59 int main()
60 {
61 //    freopen("general2.in","r",stdin);
62     n=read();k=read();
63     int t=read();
64     for(int i=1;i<n;i++){
65         int x=read(),y=read();
66         add(x,y);
67     }
68     dep[1]=1;dfs(1);
69     for(int i=1;i<=n;i++){
70         tmp[i]=make_pair(dep[i],i);
71     }
72     sort(tmp+1,tmp+n+1,comp);
73     int ans=0;
74     for(int i=1;i<=n;i++){
75         int t=tmp[i].second;
76         if(!b[t]){
77             int x=t;
78             for(int j=1;j<=k&&fa[x];j++){
79                 x=fa[x];
80             }
81             b[x]=1;
82             solve(x,-1,k);        
83             ans++;
84         }
85     }
86     printf("%d\n",ans);
87     return 0;
88 }

洛谷mNOIP模擬賽Day2-將軍令