80求条
  • 板块P10962 Computer
  • 楼主Druid
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/21 15:53
  • 上次更新2024/11/21 19:12:11
查看原帖
80求条
431095
Druid楼主2024/11/21 15:53
#include <bits/stdc++.h>
using namespace std;
int n,a[11451][3],fa[11451],sd[11451];
vector<int> mp[11451];
bool usd[11451];
int dfs(int k)
{
	int t;
	if(mp[k].empty())//是叶子节点
		return sd[k]; //返回边值
	int max1=0,max2=0,used=0;
	for(auto i:mp[k]) {
		t=dfs(i);
		if(t>=max1) {
			used=i;
			max2=max1;
			max1=t;
		}
		else
			max2=max(max2,t);
	}
	a[k][1]=max1;
	a[k][2]=max2;
	usd[used]=1;//usd用于标记父节点的最优方案用到的子节点
	return max1+sd[k];
}
void dfs2(int k)
{
	if(usd[k])
		a[k][0]=a[fa[k]][2];
	else
		a[k][0]=a[fa[k]][1];
	a[k][0]=max(a[k][0],a[fa[k]][0])+sd[k];
	for(auto i:mp[k])
		dfs2(i);
	return ;
}
int main()
{
	cin>>n;
	for(int i=2;i<=n;i++) {
		cin>>fa[i]>>sd[i];
		mp[fa[i]].push_back(i);
	}
	cout<<dfs(1)<<"\n";
	dfs2(1);
	for(int i=2;i<=n;i++)
		cout<<max(a[i][0],a[i][1])<<"\n";
	return 0;
}
2024/11/21 15:53
加载中...