40分,wa后三个点求助
查看原帖
40分,wa后三个点求助
107667
Underratted楼主2023/7/29 11:09
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,u,v,w[100100],siz[100100],ans,dis[100100],fl[100100],ans1,tot;
vector<ll> mp[100010];
void dfs(int now){
	int mx=0;
	siz[now]=w[now];
	fl[now]=1;
	for(int i=0;i<mp[now].size();i++){
		int t=mp[now][i];
		if(fl[t]==1) continue;
		dfs(t);
		if(mx<siz[t]){
			mx=siz[t];
		}
		siz[now]=siz[now]+siz[t]*w[t];
	}
	if(tot-siz[now]>mx) mx=tot-siz[now];
	if(mx*2<=tot&&!ans) ans=now; 
}
void dfs1(int now){
	ans1=ans1+(dis[now]-1)*w[now];
	//cout<<ans1<<endl;
	for(int i=0;i<mp[now].size();i++){
		int t=mp[now][i];
		if(dis[t]==0){
			dis[t]=dis[now]+1;
			dfs1(t);
		}
	}
	
}
int main(){
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);
	std::cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>w[i]>>u>>v;
		tot+=w[i];
		if(v){
			mp[i].push_back(v);
			mp[v].push_back(i);
		}
		if(u){
			mp[i].push_back(u);
			mp[u].push_back(i);
		}
	}
	dfs(1);
	dis[ans]=1;
	dfs1(ans);
	cout<<ans1;
	return 0;
}

先找重心然后再遍历的

2023/7/29 11:09
加载中...