58分小数据T飞了求助
查看原帖
58分小数据T飞了求助
110835
彭天宇楼主2020/11/25 20:29
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n,deg[N],a[N],f[N][2],root,special,cnt;
double K,sum;
int tot,head[N],ver[N<<1],nxt[N<<1];
queue<int>q;
bool ring[N],vis[N];
int read(){
	int x=0,f=1;
	char ch=getchar();
	while(!isdigit(ch)){
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(isdigit(ch)){
		x=x*10+ch-'0';
		ch=getchar();
	}
	return x*f;
}
void add(int x,int y){
	nxt[++tot]=head[x];
	head[x]=tot;
	ver[tot]=y;
}
void dfs(int x,int fa){
	f[x][1]=a[x];
	f[x][0]=0;
	for(int i=head[x];i;i=nxt[i]){
		int y=ver[i];
		if(y!=fa&&(!((x==root&&y==special)||(x==special&&y==root)))){
			dfs(y,x);
			f[x][1]+=f[y][0];
			f[x][0]+=max(f[y][0],f[y][1]);
		}
	}
}
signed main(){
	n=read();
	for(int i=1;i<=n;i++)a[i]=read();
	for(int i=1;i<=n;i++){
		int x=read()+1,y=read()+1;
		add(x,y);
		add(y,x);
		deg[x]++;
		deg[y]++;
	}
	scanf("%lf",&K);
	for(int i=1;i<=n;i++){
		ring[i]=1;
		if(deg[i]==1)q.push(i);
	}
	while(q.size()){
		int x=q.front();
		ring[x]=0;
		q.pop();
		for(int i=head[x];i;i=nxt[i]){
			int y=ver[i];
			deg[y]--;
			if(deg[y]==1)q.push(y);
		}
	}
	memset(deg,0,sizeof deg);
	int tmp=0;
	for(int i=1;i<=n;i++)tmp+=ring[i];
	if(tmp==2||tmp==1){
		dfs(1,0);
		printf("%.1lf",1.0*K*max(f[1][1],f[1][0]));
		return 0;
	}
	for(int i=1;i<=n;i++){
		if(ring[i]){
			root=i;
			special=ver[head[i]];
			dfs(root,special);
			sum=f[root][0];
			memset(f,0,sizeof f);
			dfs(special,root);
			sum=max(sum,(double)f[special][0]);
//			cout<<sum<<" "<<K<<endl;
//			cout << 1.0 * sum * K<< endl;
			printf("%.1f",sum*K);
			return 0;
		}
	}
	return 0;
}
2020/11/25 20:29
加载中...