玄学问题
查看原帖
玄学问题
224111
zysqh楼主2020/7/27 17:50

莫名奇妙 在第九个点 第一个dfsdfs会死循环

#include <cstdio>
#include <iostream>
#define S 1000005
#define int long long
using namespace std;
int n;
int zhi[S];
struct kMM {
	int ne,to,val;
} e[S*2];
int h[S],cnt;
void add(int u,int v,int val) {
	e[++cnt].ne=h[u];
	e[cnt].to=v;
	e[cnt].val=val;
	h[u]=cnt;
}

int sz[S],f[S];
void ddd(int u,int fa) {
	sz[u]=zhi[u];
	for(int i=h[u]; i; i=e[i].ne) {
		int v=e[i].to;
		if(v==fa)continue;
		ddd(v,u);
		sz[u]+=sz[v];
		f[u]+=f[v]+e[i].val*sz[v];
	}
	//cout<<u<<" "<<" f[u]="<<f[u]<<endl;
}

int dp[S],ans=0x3f3f3f3f3f3f;
void dfs(int u,int fa) {
	ans=min(ans,dp[u]);
	for(int i=h[u]; i; i=e[i].ne) {
		int v=e[i].to;

		if(v==fa)continue;
		dp[v]=dp[u]+e[i].val*(sz[u]-2*sz[v]);
		int tmp=sz[u];
		sz[u]=sz[u]-sz[v];
		sz[v]=tmp;
//		cout<<"v="<<v<<"u="<<u<<" "<<dp[v]<<" "<<e[i].val*(sz[u]-2*sz[v])<<" sz[u]="<<sz[u]<<" sz[v]="<<sz[v]<<endl;
		dfs(v,u);
		sz[u]=tmp;
	}
}
int xx,yy,zz;
signed main() {
	freopen("a.in.txt","r",stdin);
	freopen("a.out","w",stdout);
	scanf("%lld",&n);
	for(int i=1; i<=n; ++i)scanf("%lld",&zhi[i]);
	for(int i=1; i<n; ++i) {

		scanf("%lld%lld%lld",&xx,&yy,&zz);
		add(xx,yy,zz);
		add(yy,xx,zz);
	}
	ddd(1,-1);
	dp[1]=f[1];
	dfs(1,-1);
	printf("%lld\n",ans);
	return 0;
}
2020/7/27 17:50
加载中...