求调,只有12分,long long已开
查看原帖
求调,只有12分,long long已开
436102
nod1212楼主2023/3/12 20:04
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,st;
struct zl{//表示答案 
	ll dep;
	ll arr;
	ll num;
};
vector<ll> tre[200014];
vector<zl> ansa,ansb;
ll h[200014];
bool vis[200014]={0};
ll dfs(ll now){
	if(vis[now]){
		return 0;
	}
	vis[now]=true;
	for(ll i=0;i<tre[now].size();i++){
		ll tmp=dfs(tre[now][i]);
		zl fa;
		if(tmp<0){
			//cout<<now<<" "<<tmp<<endl;
			fa.dep=now;
			fa.arr=tre[now][i];
			fa.num=-tmp;
			ansa.push_back(fa);
		}
		if(tmp>0){
			fa.dep=tre[now][i];
			fa.arr=now;
			fa.num=tmp;
			ansb.push_back(fa); 
		}
		h[now]+=tmp;
	}
	return h[now]-st;
}
int main(){
	//freopen("输入.in","r",stdin);
	cin>>n;
	st=0;
	for(ll i=1;i<=n;i++){
		cin>>h[i];
		st+=h[i];
	}
	st/=n;
	for(ll i=1;i<=n-1;i++){
		ll s,t;
		cin>>s>>t;
		tre[s].push_back(t);
		tre[t].push_back(s);
	}
	dfs(1); 
	cout<<ansa.size()+ansb.size()<<endl;
	for(ll i=0;i<ansb.size();i++){//先输出下方节点给上方的 
		zl a=ansb[i];
		cout<<a.dep<<" "<<a.arr<<" "<<a.num<<endl;
	}
	for(ll i=0;i<ansa.size();i++){//再输出上方节点救济下方的以防止负数 
		zl a=ansa[i];
		cout<<a.dep<<" "<<a.arr<<" "<<a.num<<endl;
	}
	return 0;
} 
2023/3/12 20:04
加载中...