P1364 医院设置https://www.luogu.com.cn/problem/P1364
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <cstring>
#include <set>
#include <unordered_map>
#include <cmath>
#include <map>
#include <cctype>
#include <cstdlib>
#include <deque>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const int MN = 65005;
const int MAXN = 1000010;
const int INF = 0x3f3f3f3f;
#define IOS ios::sync_with_stdio(false)
#define lowbit(x) ((x)&(-x))
int s[150][150];
int peo[MAXN];
int main() {
memset(s, 0x3f, sizeof(s));
int n;
scanf("%d", &n);
int w, u, v;
for (int i = 1; i <= n; i++) {
s[i][i] = 0;
scanf("%d %d %d", peo + i, &u, &v);
if (u > 0) {
s[i][u] = s[u][i] = 1;
}
if (v > 0) {
s[i][v] = s[v][i] = 1;
}
}
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
s[i][j] = min(s[i][j], s[i][k] + s[k][j]);
}
}
}
int ans = INF;
for (int i = 1; i <= n; i++) {
int total = 0;
for (int j = 1; j <= n; j++) {
total += peo[j] * s[i][j];
}
ans = min(ans, total);
}
printf("%d", ans);
return 0;
}
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <cstring>
#include <set>
#include <unordered_map>
#include <cmath>
#include <map>
#include <cctype>
#include <cstdlib>
#include <deque>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const int MN = 65005;
const int MAXN = 1000010;
const int INF = 0x3f3f3f3f;
#define IOS ios::sync_with_stdio(false)
#define lowbit(x) ((x)&(-x))
int head[MAXN];
int w[MAXN];
int f[MAXN];
int ver[MAXN];
int nxt[MAXN];
int siz[MAXN];
int cnt;
int ans = INF;
inline void add(int x, int y) {
ver[++cnt] = y;
nxt[cnt] = head[x];
head[x] = cnt;
}
void dfs(int u, int fa, int dep) {
siz[u] = w[u];
for (int i = head[u]; i; i = nxt[i]) {
int v = ver[i];
if (v != fa) {
dfs(v, u, dep + 1);
siz[u] += siz[v];
}
}
f[1] += w[u] * dep;
}
void dp(int u, int fa) {
for (int i = head[u]; i; i = nxt[i]) {
int v = ver[i];
if (v != fa) {
f[v] = f[u] + siz[1] - siz[v] * 2;
dp(v, u);
}
}
ans = min(ans, f[u]);
}
int main() {
int n;
scanf("%d", &n);
int u, v;
for (int i = 1; i <= n; i++) {
scanf("%d %d %d", w + i, &u, &v);
if (u) {
add(i, u);
add(u, i);
}
if (v) {
add(i, v);
add(v, i);
}
}
dfs(1, 0, 0);
dp(1, 0);
printf("%d", ans);
return 0;
}