P1364 医院设置

发布时间 2023-11-24 19:45:28作者: 加固文明幻景

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));
   }
}