Uva 1218 完美的服務

2022-04-01 07:47:51 字數 914 閱讀 4342

題意:乙個網路,選出一些點做伺服器,使滿足一些條件,求伺服器最少數量。條件是,每個計算機恰有一台伺服器相連。

分析:對於每個節點,都有3種狀態,1、他是伺服器 d(u,0),2、他不是伺服器,但是父親是的 d(u,1),如果他父親是伺服器,將影響他的接下來的決策。3、他不是伺服器,父親也不是伺服器 d(u,2);

那麼: 

d(u,0) = sum};

d(u,1) = sum;

d(u,2) 子節點恰有一台是伺服器,可以利用 上面的求出, d(u,2) = min;

建樹時,可以以任一點為根。

#include using

namespace

std;

#define maxn 10005

#define inf 0x3f3f3f3f

intn;

vector

g[maxn],vertices;

int p[maxn],d[maxn][3

];//

建樹void dfs(int u,int

fa)

}int

main()

vertices.clear();

dfs(

0,-1

); memset(d,

0,sizeof

(d));

for(int i=vertices.size()-1;i>=0;i--)

d[u][

2] =inf;

for(int j=0;j)

}printf(

"%d\n

",min(d[0][0],d[0][2

]));

scanf("%d

",&n);

}return0;

}

view code

UVA 1218 完美的服務

樹上的動態規劃,仍然按照每個節點的情況分類 1.f u 0 表示u是伺服器,那麼每個子節點可以是也可以不是 2.f u 1 表示u不是伺服器,而u的父親是伺服器,則u的所有子節點都不是伺服器 3.f u 2 表示u和父親都不是伺服器,則u恰好有乙個兒子是伺服器 那麼可以得到以下轉移方程 v代表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...