WA on#4 求调
查看原帖
WA on#4 求调
1124323
A_small_WA楼主2024/10/15 23:31

rt,用的是正常求重心方法,感觉和题解区的大佬们有些不同,但自己变了几组数据都是对的,帮帮蒟蒻吧!

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e6;
int n,a,b,dep[N],dt[N],ct,bh;
long long ans,sum,f[N],siz[N];
bool vis[N],iq[N];
vector <int> vt[N];
void gc(int nw,int fa){
	siz[nw]=dt[nw];
	for(int i=0;i<vt[nw].size();i++){
		int u=vt[nw][i];
		if(u==fa) continue;
		gc(u,nw);
		siz[nw]+=siz[u];
		f[nw]=max(f[nw],siz[u]);
	}
	f[nw]=max(f[nw],sum-siz[nw]);
}
queue <int> q;
void bfs(){
	int nw;
	while(q.size()){
		nw=q.front();
		q.pop();
		if(vis[nw]) continue;
		vis[nw]=1;
		ans+=dt[nw]*dep[nw];
		for(int i=0;i<vt[nw].size();i++){
			int u=vt[nw][i];
			dep[u]=dep[nw]+1;
			q.push(u);
		}
	}
}
signed main(){
	cin>>n;
	for(int i=1;i<n;i++){
		cin>>a>>b;
		vt[a].push_back(b);
		vt[b].push_back(a);
	}
	for(int i=1;i<=n;i++){
		cin>>dt[i];
		sum+=dt[i];
	}
	gc(1,-1);
	ct=1e9,bh=1;
	for(int i=1;i<=n;i++){
		if(f[i]<ct) ct=f[i],bh=i;
	}
	dep[bh]=0;
	q.push(bh);
	bfs();
	cout<<ans;
	return 0;
}
2024/10/15 23:31
加载中...