UVa 1218 完美的服務

2022-06-20 22:36:11 字數 1351 閱讀 9696

題意:有n臺機器形成樹狀結構。要求在其中一些機器上安裝伺服器,使得每台不是伺服器的計算機恰好和一台伺服器計算機相鄰。求伺服器的最少數量。

思路:和紫書上前面的uva1220挺像的,不過這題是一棵無根樹,就把0當做根就行了,方法還是一樣的dfs。

d[u][0]:u是伺服器,則每個子結點可以是伺服器也可以不是。

d[u][1]:u不是伺服器,但u的父親是伺服器,這意味著u的所有子結點都不是伺服器。

d[u][2]:u和u的父親都不是伺服器。這意味著u恰好有乙個兒子是伺服器。

狀態轉移方程分析:

d[u][0]:由於它已經是伺服器了,所以子結點可以是也可以不是,選擇小的,d[u][1]=sum+1。1代表它自身這個伺服器。

d[u][1]:u的父親是伺服器,那麼與它相連的就不可能是伺服器了,此時很簡單,d[u][1]=sum(d[v][2])

d[u][2]:子結點有且僅有乙個伺服器,也就是說d[u][2]=min(d[u][2],d[v1][2]+d[v2][2].....+d[v][0])。由於前面已經算出了所有子結點的d[v][2]和,所以這裡可以簡化為d[u][2]=min(d[u][2],d[u][1]-d[v][2]+d[v][0])

1 #include2 #include

3 #include4 #include5 #include6

using

namespace

std;78

const

int maxn = 10000 + 5;9

10int

n, cnt;

1112 vectorsons[maxn];

1314

int d[maxn][3

];15

16void dfs(int u,int

fa)17

31for (int i = 0; i < k; i++)

3237}38

39int

main()

4053 dfs(1,0

);54 cout << min(d[1][0], d[1][2]) <

55 cin >>a;

56if (a == -1) break;57

}58return0;

59 }

UVA 1218 完美的服務

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

Uva 1218 完美的服務

題意 乙個網路,選出一些點做伺服器,使滿足一些條件,求伺服器最少數量。條件是,每個計算機恰有一台伺服器相連。分析 對於每個節點,都有3種狀態,1 他是伺服器 d u,0 2 他不是伺服器,但是父親是的 d u,1 如果他父親是伺服器,將影響他的接下來的決策。3 他不是伺服器,父親也不是伺服器 d u...

樹形DP(完美的服務,uva 1218)

inf不能弄太大,因為會不停地累加很多次,事實上加三次就爆了。inf一直習慣了用0x3f3f3f3f,這不好,特別是dp時狀態轉移需要累加的情況,應該弄得比可能的上界再大一點點就好了。或者你可以不停地判斷,讓值最高只能達到inf。include define maxn 10010 define in...