后三个点WA,全部溢出,longlong什么都开了,是不是哪里写挂了?
查看原帖
后三个点WA,全部溢出,longlong什么都开了,是不是哪里写挂了?
399250
AffineRing楼主2021/3/13 12:14

我的思路:忽略边权先找出重心,然后把重心当作根dfs一遍。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
inline ll read()
{
    ll x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
    return x*f;
}
ll maxx(ll a,ll b){return a>b?a:b;} 
const ll SIZE=100005;
ll nxt[SIZE<<1],ver[SIZE<<1],head[SIZE<<1],val[SIZE<<1],tot;
inline void add(ll x,ll y,ll z)
{
    ver[++tot]=y,nxt[tot]=head[x],head[x]=tot,val[tot]=z;
}
ll n,ans=10000000005,p,v[SIZE],s[SIZE],sum,w[SIZE];
void dfs(ll x)
{
	v[x]=1,s[x]=w[x];
	ll mxpt=0;
	for(ll i=head[x];i;i=nxt[i])
	{
		ll y=ver[i];
		if(!v[y])
		{
			dfs(y),s[x]+=s[y];
			mxpt=maxx(mxpt,s[y]);
		}
	}
	mxpt=maxx(mxpt,sum-s[x]);
	if(mxpt<ans)ans=mxpt,p=x;
}
void mvrt(ll x,ll fa,ll dep)
{
	ans+=w[x]*dep;
	for(ll i=head[x];i;i=nxt[i])
	{
		ll y=ver[i];
		if(y!=fa)mvrt(y,x,dep+val[i]);
	}
}
int main(){
	n=read();
	for(ll i=1;i<=n;i++)
		w[i]=read(),sum+=w[i];
	for(ll i=1;i<n;i++)
	{
		ll x=read(),y=read(),z=read();
		add(x,y,z),add(y,x,z);
	}
	dfs(1),ans=0,mvrt(p,-1,0);
	printf("%d\n",ans);
	return 0;
}

或者我的做法有什么问题吗?

2021/3/13 12:14
加载中...