UAC100求助
查看原帖
UAC100求助
508312
whoamIxxx楼主2024/4/24 22:06
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,w[N],ht[N],x,y;
bool vis[N],tag[N];double k;
long long f[N][2],g[N][2],ans;
vector<int>e[N];
void fdcl(int u){
	if(!ht[u])return;
	if(tag[ht[u]])x=u,y=ht[u];
	else tag[ht[u]]=1,fdcl(ht[u]);
}
void dfs(int u,int fa){
	if(ht[u])return;
	ht[u]=fa;for(int v:e[u])if(v^fa)dfs(v,u);
}
void dp(int u){
	if(u==y)f[u][1]=w[u];
	else f[u][1]=g[u][1]=w[u];
	for(int v:e[u])if(!vis[v]){
		if(u==x&&v==y||u==y&&v==x)continue;
		vis[v]=1;dp(v);
		f[u][0]+=max(f[v][0],f[v][1]);
		g[u][0]+=max(g[v][0],g[v][1]);
		f[u][1]+=f[v][0],g[u][1]+=g[v][0];
	}
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%d",&w[i]);
	for(int i=1,u,v;i<=n;i++){
		scanf("%d%d",&u,&v);u++,v++;
		e[u].push_back(v);
		e[v].push_back(u);
	}dfs(1,0);scanf("%lf",&k);
	for(int i=1;i<=n;i++)if(!vis[i]){
		x=y=0;tag[i]=1;fdcl(i);
		if(x|y)vis[x]=1,dp(x),ans+=max(max(f[x][0],g[x][0]),g[x][1]);
		else vis[i]=1,dp(i),ans+=max(f[i][0],f[i][1]);
	}printf("%.1lf",ans*k);
	return 0;
}

rt,从双倍经验那里改的代码,WA on Hack 数据第 5 个点

2024/4/24 22:06
加载中...