UVA 1218 完美的服務

2021-09-02 11:37:48 字數 886 閱讀 8177

樹上的動態規劃,仍然按照每個節點的情況分類:

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...