90分求助
查看原帖
90分求助
528466
FarmerZhuGe楼主2024/2/24 19:24
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e5+10,M=2e5+10,INF=1e9;
int n;
double m;
int h[N],e[M],ne[M],w[N],rm[M],idx;
int f1[N][2],f2[N][2];
bool st[N],ins[N];
double ans;
void add(int a,int b){
	e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dfs_f(int u,int ap,int f[][2],int from){
	f[u][1]=(u==ap?-INF:w[u]);
	for(int i=h[u];~i;i=ne[i]){
		if(rm[i]||i==(from^1)) continue;
		int j=e[i];
		dfs_f(j,ap,f,i);
		f[u][0]+=max(f[j][0],f[j][1]);
		f[u][1]+=f[j][0];
	}
}
void dfs_c(int u,int from){
	st[u]=ins[u]=true;
	for(int i=h[u];~i;i=ne[i]){
		if(i==(from^1)) continue;
		int j=e[i];
		if(!st[j]) dfs_c(j,i);
		else if(ins[j]){
			rm[i]=rm[i^1]=1;
			dfs_f(j,-1,f1,-1);
			dfs_f(j,u,f2,-1);
			ans+=max(max(f1[j][0],f1[j][1]),f2[j][1])*m;
		}
	}
	ins[u]=false;
}
int main(){
	scanf("%d",&n);
	for(int i=0;i<n;i++) scanf("%d",&w[i]);
	memset(h,-1,sizeof h);
	for(int i=0;i<n;i++){
		int a,b;
		scanf("%d%d",&a,&b);
		add(a,b),add(b,a);
	}
	scanf("%lf",&m);
	dfs_c(1,-1);
	printf("%.1lf",ans);
	return 0;
}

2024/2/24 19:24
加载中...