60pts #4 #5 求助 dfs
  • 板块P1364 医院设置
  • 楼主U____
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/8/2 16:24
  • 上次更新2023/11/3 06:20:12
查看原帖
60pts #4 #5 求助 dfs
853245
U____楼主2023/8/2 16:24
#include<bits/stdc++.h>

using namespace std;
const int M = 105;
int n;
unsigned long long ans ;

struct tree {
	int to, ext;
}edge[M*2];
int head[M],w[M], tot;
void add(int u, int v) {
	edge[++tot].to = v;
	edge[tot].ext = head[u];
	head[u] = tot;
//	cout<<1111111111;
}

int siz[M], f[M], root;
void find(int rt, int fa) {
	
	siz[rt] = 1;
	for(int i = head[rt]; i!=-1; i = edge[i].ext) {
		int to = edge[i].to;
		if(to==fa) continue;
			find(to, rt);
			siz[rt] += siz[to];
			f[rt] = max(f[rt], siz[to]);
		
	}
	f[rt] = max(f[rt], n - siz[rt]);
	if(f[rt] < f[root] || root == 0) {
		root = rt;
	}
	
}

int dep[M], vis[M], cnt;
void dfs1(int rt, int fa) {
	
	for(int i = head[rt]; i!=-1; i = edge[i].ext) {
		int to = edge[i].to;
		if(to == fa) continue;
			dep[to] = dep[rt] + 1;
			dfs1(to, rt);
	}
}
void dfs2(int rt, int fa) {
	ans += w[rt] * (dep[rt]);
	for(int i = head[rt]; i!=-1; i = edge[i].ext) {
		int to = edge[i].to;
		if(to == fa) continue;
			dfs2(to, rt);
	}
}

int main() {
	memset(head,-1,sizeof(head));
	int u, v,k;
	cin>>n;
	for(int i = 1; i <= n; i ++) {
		cin>>w[i]>>u>>v;
		if(u) add(i, u), add(u, i);
		if(v) add(i, v), add(v, i);
	}
	find(1, 0);
	dfs1(root, 0);
	dfs2(root, 0);
	cout<<ans;
	return 0;
} 
2023/8/2 16:24
加载中...