您的位置:首页 > Web前端

UVA1218 - Perfect Service

2016-02-07 19:45 519 查看
1.d(0, u)表示u是服务器.

2.d(1, u)表示u的父节点是服务器.

3.d(2, u)表示u和u的父节点都不是服务器

状态转移方程:

v是u的子节点

d(0, u) = sum(min(d(0, v), d(1, v)));

d(1, u) = sum(d(2, v));

d(2, u) = min(d(2, u), d(1, u) - d(2, v) + d(0, v));

#include <iostream>
#include <vector>
#include <cstdio>
#include <cstring>

using namespace std;

#define INF 1000000
#define maxn 10000 + 5
int d[3][maxn];
vector<int> v[maxn];
void dp(int n, int fa)
{
for(int i = 0; i < v
.size(); i++)
{
int h = v
[i];
if(h != fa){
dp(h, n);
d[0]
+= min(d[0][h], d[1][h]);
d[1]
+= d[2][h];
}
}
d[2]
= INF;
for(int i = 0; i < v
.size(); i++)
{
int h = v
[i];
if(h != fa){
d[2]
= min(d[2]
, d[1]
- d[2][h] + d[0][h]);
}
}
d[0]
++;
}
int main()
{
//  freopen("in.txt", "r", stdin);
int n;

while(cin >> n)
{
for(int i = 1; i <= n; i++)
v[i].clear();
for(int i = 1; i <= n - 1; i++)
{
int a, b;
cin >> a >> b;
v[a].push_back(b);
v[b].push_back(a);
}
memset(d, 0, sizeof(d));
dp(1, -1);
cout << min(d[0][1], d[2][1]) << endl;
int m;
cin >> m;
if(m == -1)
break;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: