洛谷 P1364 医院设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 101, M = 2 * N;
int n, u, v, h[N], w[M], e[M], ne[M], idx;
int ans = 1e9;
bool visited[N];
struct node {
int u, s;
node() {}
node(int idx, int step) : u(idx), s(step) {}
};
node q[N];
void add(int u, int v) {
e[idx] = v, ne[idx] = h[u], h[u] = idx++;
}
int bfs(int x) {
int sum = 0;
memset(visited, false, n + 1);
visited[x] = true;
int hh = 0, tt = -1;
q[++tt] = node(x, 1);
while (hh <= tt) {
auto[u, s] = q[hh++];
for (int i = h[u]; ~i; i = ne[i]) {
int v = e[i];
if (visited[v]) continue;
q[++tt] = node(v, s + 1);
visited[v] = true;
sum += w[v] * s;
}
}
return sum;
}
int main() {
scanf("%d", &n);
memset(h, -1, (n + 1) * 4);
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);
}
for (int i = 1; i <= n; ++i) ans = min(ans, bfs(i));
printf("%d\n", ans);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <bits/stdc++.h>
using namespace std;
const int N = 101, INF = INT_MAX;
int ans = INF;
int d[N][N];
int n, u, v, w[N];
int main() {
scanf("%d", &n);
fill(d[0], d[0] + N * N, INF);
for (int i = 1; i <= n; ++i) {
scanf("%d%d%d", &w[i], &u, &v);
if (u) d[i][u] = d[u][i] = 1;
if (v) d[i][v] = d[v][i] = 1;
}
for (int k = 1; k <= n; ++k)
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
if (d[i][k] < INF && d[k][j] < INF)
d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
for (int i = 1; i <= n; ++i) {
int sum = 0;
for (int j = 1; j <= n; ++j)
if (i != j)
sum += w[j] * d[i][j];
ans = min(ans, sum);
}
printf("%d", ans);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <bits/stdc++.h>
using namespace std;
const int N = 101, M = 2 * N;
int n, u, v, h[N], w[M], e[M], ne[M], idx;
int ans = 1e9;
bool visited[N];
void add(int u, int v) {
e[idx] = v, ne[idx] = h[u], h[u] = idx++;
}
int dfs(int u, int s) {
int sum = s * w[u];
for (int i = h[u]; ~i; i = ne[i]) {
int v = e[i];
if (visited[v]) continue;
visited[v] = true;
sum += dfs(v, s + 1);
}
return sum;
}
int main() {
scanf("%d", &n);
memset(h, -1, (n + 1) * 4);
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);
}
for (int i = 1; i <= n; ++i) {
memset(visited, false, n + 1);
visited[i] = true;
ans = min(ans, dfs(i, 0));
}
printf("%d\n", ans);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <bits/stdc++.h>
using namespace std;
const int N = 101, M = 2 * N;
int n, u, v, h[N], w[M], e[M], ne[M], idx;
int deep[N], dist[N], sum[N];
int ans;
void add(int u, int v) {
e[++idx] = v, ne[idx] = h[u], h[u] = idx;
}
void dfs(int u, int f) {
deep[u] = deep[f] + 1;
for (int i = h[u]; i; i = ne[i]) {
int v = e[i];
if (v == f) continue;
dfs(v, u);
sum[u] += sum[v];
}
}
int dp(int u, int f) {
for (int i = h[u]; i; i = ne[i]) {
int v = e[i];
if (v == f) continue;
dist[v] = dist[u] + sum[1] - sum[v] - sum[v];
ans = min(ans, dist[v]);
dp(v, u);
}
}
int main() {
scanf("%d", &n);
for (register int i = 1; i <= n; ++i) {
scanf("%d%d%d", &w[i], &u, &v);
sum[i] = w[i];
if (u) add(i, u), add(u, i);
if (v) add(i, v), add(v, i);
}
deep[0] = 0;
dfs(1, 0);
for (register int i = 1; i <= n; ++i)
dist[1] += (deep[i] - 1) * w[i];
ans = dist[1];
dp(1, 0);
printf("%d\n", ans);
return 0;
}