(玄关)sub1全T求调
查看原帖
(玄关)sub1全T求调
550325
hdbhdbhdb楼主2025/7/23 14:27

sub0全过sub1全t

#include<bits/stdc++.h>
using namespace std;
int p[100010],father[100010];
bool b[100010]={0};
vector<int> a[100010];
double f[100010][2],k,ans,g[100010][2];
int read(){
    int x=0,w=1;
    int ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') w=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*w;
}
void dfs(int x,int fa){
    b[x]=1;
	f[x][0]=0,f[x][1]=p[x];
	for(int i=0;i<a[x].size();++i){
		if(b[a[x][i]]==1) continue;
		dfs(a[x][i],x);
		f[x][0]+=max(f[a[x][i]][0],f[a[x][i]][1]);
		f[x][1]+=f[a[x][i]][0];
	}
}
void dfs2(int x,int fa){
    b[x]=1;
	g[x][0]=0,g[x][1]=p[x];
	for(int i=0;i<a[x].size();++i){
		if(b[a[x][i]]==1) continue;
		dfs2(a[x][i],x);
		g[x][0]+=max(g[a[x][i]][0],g[a[x][i]][1]);
		g[x][1]+=g[a[x][i]][0];
	}
}
int find(int x){
	return father[x]==x?x:x=find(father[x]);
}
int main(){
	int n;
	n=read();
	for(int i=0;i<n;++i){
		p[i]=read();
		father[i]=i;
	}
	int S,T;
	for(int i=0;i<n;++i){
		int u,v;
		u=read(),v=read();
		if(find(u)==find(v)){
			S=u;T=v;
			continue;
		}
		a[u].push_back(v);
		a[v].push_back(u);
		father[find(v)]=find(u);
	}
	cin>>k;
	dfs(S,-1);
    memset(b,0,sizeof(b));
	dfs2(T,-1);ans=max(f[S][0],g[T][0]);
	printf("%.1lf\n",ans*k);
	return 0;
}

2025/7/23 14:27
加载中...