求助
查看原帖
求助
784829
IntoTheDusk楼主2024/7/20 16:54

这份代码在#2和#6上WA,在#4上MLE

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e6+10;
int n,a[N],f[N][2];
int idx,head[N];
struct edge{
	int v,next;
}e[N<<1];
bool vis[N];
int st,ed,cut;
void add_edge(int u,int v){
	e[idx]={v,head[u]};head[u]=idx;idx++;
}
void findc(int u,int fa){
	vis[u]=true;
	for(int i=head[u];i;i=e[i].next){
		int v=e[i].v;
		if(v==fa) continue;
		if(vis[v]){
			st=u;ed=v;cut=i;
			continue;
		}
		findc(v,u);
	}
}
void dfs(int u,int fa){
	f[u][0]=0;f[u][1]=a[u];
	for(int i=head[u];i;i=e[i].next){
		int v=e[i].v;
		if(v==fa) continue;
		if(i==cut||(i^1)==cut) continue;
		dfs(v,u);
		f[u][1]+=f[v][0];
		f[u][0]+=max(f[v][0],f[v][1]);
	}
}
signed main(){
	ios::sync_with_stdio(false);cin.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++){
		int fa;cin>>a[i]>>fa;
		add_edge(i,fa);add_edge(fa,i);
	}
	int ans=0;
	for(int i=1;i<=n;i++){
		if(!vis[i]){
		    st=ed=cut=0;
			findc(i,0);
			dfs(st,0);int ans1=f[st][0];
			dfs(ed,0);int ans2=f[ed][0];
			ans+=max(ans1,ans2);
		}
	}
	cout<<ans<<'\n';
	return 0;
}
2024/7/20 16:54
加载中...