100pts,sub2全WA,求助
查看原帖
100pts,sub2全WA,求助
661913
liwenxi1145144444楼主2025/1/13 10:38
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,rd[100005],h[100005],cnt;
double dp[100005][2],f[100005][2],k,ans;
bool fla[100005];
vector<int> v[100005];
void top_sort(){
	queue<int> q;
	for(int i=1;i<=n;i++){
		if(rd[i]==1){
			q.push(i);
		}
	}
	while(!q.empty()){
		int x=q.front();
		q.pop();
		for(int i=0;i<(int)v[x].size();i++){
			int y=v[x][i];
			rd[y]--;
			if(rd[y]==1){
				q.push(y);
			}
		}
	}
	for(int i=1;i<=n;i++){
		if(rd[i]==2){
			h[++cnt]=i;
			break;
		}
	}
}
void dfs(int x,int fa){
	for(int i=0;i<(int)v[x].size();i++){
		int y=v[x][i];
		if(y!=fa&&!fla[y]&&rd[y]==2){
			h[++cnt]=y;
			fla[y]=1;
			dfs(y,x);
			break;
		}
	}
}
void dfs_dp(int x,int fa){
	for(int i=0;i<(int)v[x].size();i++){
		int y=v[x][i];
		if(y!=fa&&!fla[y]){
			dfs(y,x);
			dp[x][0]+=max(dp[y][0],dp[y][1]);
			dp[x][1]+=dp[y][0];
		}
	}
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>dp[i][1];
	}
	for(int i=1;i<=n;i++){
		int x,y;
		cin>>x>>y;
		x++;
		y++;
		v[x].push_back(y);
		v[y].push_back(x);
		rd[x]++;
		rd[y]++; 
	}
	cin>>k;
	top_sort();
	fla[h[1]]=1;
	dfs(h[1],-1);
	for(int i=1;i<=cnt;i++){
		dfs_dp(h[i],-1);
	}
	f[1][0]=dp[h[1]][0];
	for(int i=2;i<=cnt;i++){
		f[i][0]=max(f[i-1][0],f[i-1][1])+dp[h[i]][0];
		f[i][1]=f[i-1][0]+dp[h[i]][1];
	}
	ans=max(f[cnt][0],f[cnt][1]);
	memset(f,0,sizeof(f));
	f[1][1]=dp[h[1]][1];
	for(int i=2;i<=cnt;i++){
		f[i][0]=max(f[i-1][0],f[i-1][1])+dp[h[i]][0];
		f[i][1]=f[i-1][0]+dp[h[i]][1];
	}
	ans=max(ans,f[cnt][0]);
	ans*=k;
	cout<<fixed<<setprecision(1)<<ans;
	return 0;
}
2025/1/13 10:38
加载中...