模拟求调
查看原帖
模拟求调
667180
Assassin_HG楼主2024/10/9 19:00

核心思想如下:

将一颗树按照与根节点的距离进行分层,同个图形的是一种分层,总共就只有两种分层,最后看看哪个更小就行,因为是树,就不用考虑环等情况,自造样例可过,数据样例可过,实测10pt

in:
10
1 10 3 2 3 4
2 11 1 5
3 3 1 6
4 9 1 7
5 5 1 8
6 2 2 9 10
7 8 0
8 7 0
9 6 0
10 1 0

out:
25
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e3 + 10;
struct Edge {
	int nxt, to;
} e[maxn << 1];
int a[maxn], head[maxn];
int n, sum1, sum2, len = 0, flag = 0;
void add(int u, int v) {
	e[++len].nxt = head[u];
	e[len].to = v;
	head[u] = len;
}
void dfs(int u, int flag) {
	if (flag == 0) {
		sum1 += a[u];
	} else {
		sum2 += a[u];
	}
	flag = (flag + 1) % 2;
	for (int i = head[u]; i; i = e[i].nxt) {
		int v = e[i].to;
		dfs(v, flag);
	}
	return;
}
int main() {
	scanf("%d", &n);
	for (int i = 1, u, m; i <= n; ++i) {
		scanf("%d%d%d", &u, &a[i], &m);
		if (m == 0) {
			continue;
		}
		for (int j = 1, v; j <= m; ++j) {
			scanf("%d", &v);
			add(u, v);
		}
	}
	dfs(1, 0);
	printf("%d", min(sum1, sum2));
	return 0;
}
2024/10/9 19:00
加载中...