求 [USACO22DEC] Barn Tree S
  • 板块学术版
  • 楼主oier25
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/11 17:38
  • 上次更新2024/7/11 19:22:52
查看原帖
求 [USACO22DEC] Barn Tree S
719233
oier25楼主2024/7/11 17:38
#include<bits/stdc++.h>
using namespace std;
long long n,a[200005],nxt[400005],h[400005],to[400005],cnt,sum,b[200005];
bool vis[400005];
struct node{
	long long p,g,w;
};
queue<node>q,pq;
void add(long long u,long long v){
	to[++cnt]=v;
	nxt[cnt]=h[u];
	h[u]=cnt;
}
long long dfs(long long u){
	vis[u]=1;
	for(long long e=h[u];e;e=nxt[e]){
		long long v=to[e];
		if(vis[v])continue;
		long long k=dfs(v);
		if(k){
			a[u]+=k;
			q.push((node){v,u,k});
		}
		vis[v]=0;
	}
	return a[u]-sum;
}
int main(){
//	freopen("hay.in","r",stdin);
//	freopen("hay.out","w",stdout);
	cin>>n;
	for(long long i=1;i<=n;i++){
		cin>>a[i];
		b[i]=a[i];
		sum+=a[i];
	}
	sum/=n;
	for(long long i=1;i<n;i++){
		long long x,y;
		cin>>x>>y;
		add(x,y);
		add(y,x);
	}
	dfs(1);
	cout<<q.size()<<"\n";
	while(!q.empty()){
		if(q.front().w<0){
			swap(q.front().p,q.front().g);
			q.front().w=-q.front().w;
		}
		if(a[q.front().p]<0)pq.push((node){q.front().p,q.front().g,q.front().w});
		else cout<<q.front().p<<" "<<q.front().g<<" "<<q.front().w<<"\n";
		q.pop();
	}
	while(!pq.empty()){
		cout<<pq.front().p<<" "<<pq.front().g<<" "<<pq.front().w<<"\n";
		pq.pop();
	}
	return 0;
}

12分

2024/7/11 17:38
加载中...