Subtask #1WA on #2 #4
查看原帖
Subtask #1WA on #2 #4
684245
zhangyaiwei楼主2025/1/18 11:59

救一下啊

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,x,y,ans1,ans2,p[111111],c[111111],f[2][111111],fs[2];
vector<int> v[111111],s[111111],rs;
queue<int> q;
double k;
void Dfs(int rt){
	f[0][rt]=0,f[1][rt]=p[rt];
	for(int i=0;i<s[rt].size();i++){
		int sn=s[rt][i];
		Dfs(sn);
		f[0][rt]+=max(f[0][sn],f[1][sn]);
		f[1][rt]+=f[0][sn];
	}
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>p[i];
	}
	for(int i=1;i<=n;i++){
		cin>>x>>y;
		x++,y++;
		v[x].push_back(y);
		v[y].push_back(x);
		c[x]++,c[y]++;
	}
	cin>>k;
	for(int i=1;i<=n;i++){
		if(c[i]==1){
			q.push(i);
		}
	}
	while(!q.empty()){
		int qs=q.front();
		q.pop();
		for(int i=0;i<v[qs].size();i++){
			int N=v[qs][i];
			c[N]--;
			if(c[N]>0){
				if(c[N]==1) q.push(N);
				s[N].push_back(qs);
			}
		}
	}
	for(int i=1;i<=n;i++){
		if(c[i]<2) continue;
		rs.push_back(i);
		Dfs(i);
	}
	fs[0]=f[0][rs[0]],fs[1]=-1145141919;
	for(int i=1;i<rs.size();i++){
		int fs0=max(fs[0],fs[1])+f[0][rs[i]],fs1=fs[0]+f[1][rs[i]];
		fs[0]=fs0,fs[1]=fs1;
	}
	ans1=max(fs[0],fs[1]);
	fs[0]=-1145141919,fs[1]=f[1][rs[0]];
	for(int i=1;i<rs.size();i++){
		int fs0=max(fs[0],fs[1])+f[0][rs[i]],fs1=fs[0]+f[1][rs[i]];
		fs[0]=fs0,fs[1]=fs1;
	}
	ans2=fs[0];
	cout<<fixed<<setprecision(1)<<k*max(ans1,ans2);
}
2025/1/18 11:59
加载中...