P1364 医院设置 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
这道题很好哎
知识点:
1.二叉树的存储,父节点的处理, dfs遍历(前中后), 记忆化
2.暴力枚举
#include <iostream>
#include <cstring>
using namespace std;
struct node
{
int f, l, r, d;
}tree[110];
int n, sum, ans = 0x3f3f3f3f;
bool st[110];
void dfs(int dis, int u)
{
st[u] = true;
sum += tree[u].d * dis;
int fa = tree[u].f, lc = tree[u].l, rc = tree[u].r;
if(fa && !st[fa])
{
dfs(dis + 1, fa);
}
if(lc && !st[lc])
{
dfs(dis + 1, lc);
}
if(rc && !st[rc])
{
dfs(dis + 1, rc);
}
}
int main()
{
cin >> n;
for(int i = 1; i <= n; i ++ )
{
cin >> tree[i].d >> tree[i].l >> tree[i].r;
tree[tree[i].l].f = i;
tree[tree[i].r].f = i;
}
//枚举
for(int i = 1; i <= n; i ++ )
{
st[i] = true;
sum = 0;
memset(st, false, sizeof st);
dfs(0, i);
ans = min(sum, ans);
}
cout << ans << endl;
return 0;
}