樹上的動態規劃,仍然按照每個節點的情況分類:
1.f[u][0]表示u是伺服器,那麼每個子節點可以是也可以不是
2.f[u][1]表示u不是伺服器,而u的父親是伺服器,則u的所有子節點都不是伺服器
3.f[u][2]表示u和父親都不是伺服器,則u恰好有乙個兒子是伺服器
那麼可以得到以下轉移方程:(v代表u的所有字節點)
f[u][0]=sum+1
f[u][1]=sum
f[u][2]較為複雜,我們需要列舉每乙個v,選它的f[v][0],然後加上其他兒子節點的f[v][2],不過由於f[u][1]求出了sum,我們可以利用f[u][1]來寫狀態轉移方程:f[u][2]=min(f[u][1]-f[v][2]+f[v][1])
#include#include#include#include#includeusing namespace std;
const int maxn=1e4+5;
const int inf=1e4+5;
int f[maxn][5],n,x,y;
struct edge
};vectoredges;
vectorg[maxn];
void clear()
void addedge(int from,int to));
g[from].push_back(edges.size()-1);
}void dfs(int u,int fa)
f[u][2]=inf;
for(int i=0;if[u][0]++;
}int main()
dfs(1,0);
printf("%d\n",min(f[1][0],f[1][2]));
}}
Uva 1218 完美的服務
題意 乙個網路,選出一些點做伺服器,使滿足一些條件,求伺服器最少數量。條件是,每個計算機恰有一台伺服器相連。分析 對於每個節點,都有3種狀態,1 他是伺服器 d u,0 2 他不是伺服器,但是父親是的 d u,1 如果他父親是伺服器,將影響他的接下來的決策。3 他不是伺服器,父親也不是伺服器 d u...
UVa 1218 完美的服務
題意 有n臺機器形成樹狀結構。要求在其中一些機器上安裝伺服器,使得每台不是伺服器的計算機恰好和一台伺服器計算機相鄰。求伺服器的最少數量。思路 和紫書上前面的uva1220挺像的,不過這題是一棵無根樹,就把0當做根就行了,方法還是一樣的dfs。d u 0 u是伺服器,則每個子結點可以是伺服器也可以不是...
樹形DP(完美的服務,uva 1218)
inf不能弄太大,因為會不停地累加很多次,事實上加三次就爆了。inf一直習慣了用0x3f3f3f3f,這不好,特別是dp時狀態轉移需要累加的情況,應該弄得比可能的上界再大一點點就好了。或者你可以不停地判斷,讓值最高只能達到inf。include define maxn 10010 define in...