題意:有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 #include3 #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...