P1364 医院设置
P1364 医院设置
存树
struct Node {
int left, right, father, value;
} t[MAXN];
int main()
{
for (int i = 1; i <= n; i++)
{
cin >> t[i].value >> t[i].left >> t[i].right;
}
for (int i = 1; i <= n; i++)
{
t[t[i].left].father = i;
t[t[i].right].father = i;
}
}
DFS
从指定结点开始,进行 dfs。
对于某个结点:
- 搜索的深度就是源点到这个结点的距离。
- 单点贡献就是源点到这个节点的距离乘上该点的居民数量然后加上自己父节点和左右子节点的贡献的总和。
#include <iostream>
#include <cstring>
#define MAXN 110
using namespace std;
int n, ans = 10000000000;
bool vis[MAXN];
int cal(int x, int d)
{
if (!x || vis[x])
{
return 0;
}
vis[x] = true;
return cal(t[x].left, d + 1) + cal(t[x].right, d + 1) + cal(t[x].father, d + 1) + t[x].value * d;
}
int main()
{
for (int i = 1; i <= n; i++)
{
memset(vis, 0, sizeof(vis));
ans = min (ans, cal(i, 0));
}
}