1. 程式人生 > >UVA 1218 (樹形DP)

UVA 1218 (樹形DP)

題意:給n臺機器形成無根樹狀結構,然後需要安裝一些伺服器,使得不是伺服器的計算機恰好和一臺伺服器計算機相鄰,問最少需要安裝的伺服器臺數

題解:形成無根樹狀想到的必然是樹形DP,其次很明顯是對該點是不是伺服器進行討論。還有關鍵是恰好一臺相鄰。(沒看到這個條件狀態轉移看了半天沒看明白)
dp[u][0]:自己不是伺服器,父親是,所以所有子節點也不是
dp[u][1]:自己是伺服器,子節點可以是也可以不是
dp[u][2]:自己和父親都不是,所有有一個子節點必是

dp[u][0] = sum(dp[v][2])
dp[u][1] = sum(min(dp[v][1],dp[v][0])
dp[u][2] = min(dp[v’][1] + sum(dp[v”][2]))
= min(dp[v’][1] + sum(dp[v][2]) - dp[v’][2])
= min(dp[v’][1] + dp[u][0] - dp[v’][2])

還有個坑是dp[u][2]這個INF不能太大。我也是看了別人的才知道= =。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <map>
#include <vector>
#define INF 0x3f3f
using namespace std;
const int maxn = 1e5 + 5
; typedef long long LL; vector <int> vec[maxn]; int dp[maxn][3];//dp[][0] 自己不是伺服器但是父親是, dp[][1]自己是伺服器, dp[][2] 自己和父親都不是伺服器 void dfs(int u, int fa){ dp[u][0] = 0; dp[u][1] = 1; dp[u][2] = INF; for(int i=0; i<vec[u].size(); i++){ int v = vec[u][i]; if(v == fa) continue
; dfs(v,u); } for(int i=0; i<vec[u].size(); i++){ int v = vec[u][i]; if(v == fa) continue; dp[u][0] += dp[v][2]; dp[u][1] += min(dp[v][1], dp[v][0]); } for(int i=0; i<vec[u].size(); i++){ int v = vec[u][i]; if(v == fa) continue; dp[u][2] = min(dp[u][2], dp[v][1] + dp[u][0] - dp[v][2]); } } int main(){ int n; while(scanf("%d",&n) == 1 && n != -1){ for(int i=0; i<maxn; i++){ vec[i].clear(); } for(int i=0; i<n-1; i++){ int u,v; scanf("%d%d",&u,&v); vec[u].push_back(v); vec[v].push_back(u); } dfs(1,-1); printf("%d\n",min(dp[1][1], dp[1][2])); int end; scanf("%d",&end); if(end == -1) break; } } /* 6 1 3 2 3 3 4 4 5 4 6 0 2 1 2 -1 */

相關推薦

Perfect Service UVA - 1218樹形dp

pen perf name isp 技術 get sca code esp Perfect Service UVA - 1218 題意:安裝服務器,使得不是服務器的計算機恰好和一臺服務器計算機相連。問最少安多少服務器計算機。 之前一直不理解第三個轉移方程,,今天再看竟然是

UVA 1218 樹形DP

題意:給n臺機器形成無根樹狀結構,然後需要安裝一些伺服器,使得不是伺服器的計算機恰好和一臺伺服器計算機相鄰,問最少需要安裝的伺服器臺數 題解:形成無根樹狀想到的必然是樹形DP,其次很明顯是對該點是不是伺服器進行討論。還有關鍵是恰好一臺相鄰。(沒看到這個條件

UVA-1220-Party at Hali-Bula && UVA-1218-Perfect Service樹形DP

UVA-1220-Party at Hali-Bula 題意: 一個公司員工要舉行聚會,要求任意一個人不能和他的直接上司同時到場,一個員工只有一個支系上司,現在求最多有多少人到場,並且方案是否唯一(紫書282頁) 分析: 紫薯寫的很清楚,而且也很基礎,就不重複了,只做幾點記錄和總結 輸入中輸入

UVa 1220 - Party at Hali-Bula樹形DP

style sin col 轉移 time ali main 分析 hal 鏈接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem

UVA 1292 Strategic game樹形DP

題目連結 題意 一棵樹,要放置哨兵(只能放在節點上),求最少放置哨兵保證能監視到所有的邊。 即最小點覆蓋 思路 樹形DP入門,記得之前第一次遇到這題是用二分圖求最小點覆蓋過的,學了樹形DP思想後再

POJ題目1947 Rebuilding Roads樹形dp

line div space cpp i++ tex tab wan blue Rebuilding Roads Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 9957 Acc

HDU 4717樹形DP

== cnblogs div code 刪除 splay 沒有 str std 由於內存的限制。所以盡量要少開數組。一開始用了數組記錄每個點的度數和每個點的兒子數,還有vis記錄這個點是否處理過。然後超內存了。 實際上兒子數沒有必要存下來,只是每次遍歷自身的時候會用到,然後

lightoj 1382 - The Queue樹形dp

volume urn www. vector num clu href get 題目 題目鏈接:http://www.lightoj.com/volume_showproblem.php?problem=1382 題解:簡單的樹形dp加上組合數學。 #incl

bzoj1907: 樹的路徑覆蓋樹形DP

ret print ... std getc 覆蓋 amp ostream tchar   一眼題...   f[i][0]表示在i連接一個子樹的最小值,f[i][1]表示在i連接兩個子樹的最小值,隨便轉移...   樣例挺強的1A了美滋滋... #inclu

【HDU】1520 Anniversary party樹形dp

pre ret set rsa main eof hdu opened event 題目 題目 分析 帶權值的樹上最大獨立集 代碼 1 #include <bits/stdc++.h> 2 using nam

有線電視網樹形dp

code 一個 傳輸 mes 收益 滿足 -m 收費 -- 有線電視網 某收費有線電視網計劃轉播一場重要的足球比賽。他們的轉播網和用戶終端構成一棵樹狀結構,這棵樹的根結點位於足球比賽的現場,樹葉為各個用戶終端,其他中轉站為該樹的內部節點。從轉播站到轉播站以及從轉播站到所有

[Bzoj3677][Apio2014]連珠線樹形dp

print -i 定義 但是 bsp https 開始 sta http 3677: [Apio2014]連珠線 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 434 Solved: 270[Submit]

Perfect service樹形dp

sin space cst ice return 服務器 scan con 表示 Perfect service(樹形dp) 有n臺機器形成樹狀結構,要求在其中一些機器上安裝服務器,使得每臺不是服務器的計算機恰好和一臺服務器計算機相鄰。求服務器的最小數量。n<=10

【POJ】1935 Journey樹形dp

scan AR urn vector 答案 span ace CA include 題目 傳送門:QWQ 分析 涼涼。 答案是所有要經過的點到根所經過的邊權和減去最大的邊權。 代碼 vector好慢啊 #include <

[HAOI2015]樹上染色樹形dp

long long 價值 記錄 接下來 tin ++ 我們 不用 include [HAOI2015]樹上染色 題目描述 有一棵點數為 N 的樹,樹邊有邊權。給你一個在 0~ N 之內的正整數 K ,你要在這棵樹中選擇 K個點,將其染成黑色,並將其他 的N-K個點染成白色

[HAOI2009]毛毛蟲樹形dp

cpp class dfs 代碼 ans 文本文 col 輸入 math [HAOI2009]毛毛蟲 題目描述 對於一棵樹,我們可以將某條鏈和與該鏈相連的邊抽出來,看上去就象成一個毛毛蟲,點數越多,毛毛蟲就越大。例如下圖左邊的樹(圖 1 )抽出一部分就變成了右邊的一個毛毛蟲

題解報告:hdu 2196 Computer樹形dp

put cte height ont rst sed mem tle 技術 Problem Description A school bought the first computer some time ago(so this computer‘s id is 1). D

UVa12186:Another Crisis樹形DP

int list 一行 wide and hierarchy 代碼 cat NPU 一道簡單的樹形DP送給你。 A couple of years ago, a new world wide crisis started, leaving many people wit

Dumb Bones UVA - 10529概率dp

print 需要 min set can eof 等於 正在 mod 題意: 你試圖把一些多米諾骨牌排成直線,然後推倒它們。但是如果你在放骨牌的時候不小心把剛放的骨牌碰倒了,它就會把相臨的一串骨牌全都碰倒, 而你的工作也被部分的破壞了。 比如你已經把骨牌擺成了DD__DxD

[JLOI2016/SHOI2016]偵察守衛樹形dp

pre 放置 貪心 char 地圖 連通 註意 += stream 小R和B神正在玩一款遊戲。這款遊戲的地圖由N個點和N-1條無向邊組成,每條無向邊連接兩個點,且地圖是連通的。換句話說,遊戲的地圖是一棵有N個節點的樹。 遊戲中有一種道具叫做偵查守衛,當一名玩家在一個點上放置