求助并查集
查看原帖
求助并查集
80723
Sh4kespeare楼主2023/3/22 15:51
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
int n;
int atk[1000010],fa[1000010]; 
int find(int x){
	if(fa[x]==x)return x;
	return fa[x]=find(fa[x]);
}
vector<pair<int,int> >q;
struct Edge{
	int to,nxt;
}edge[2000010];
int head[1000010],tot=0;
void add(int u,int v){
	edge[++tot].to=v;
	edge[tot].nxt=head[u];
	head[u]=tot;
}
long long dp[1000010][2];
void dfs(int x,int fa){
	dp[x][0]=0,dp[x][1]=atk[x];
	for(int i=head[x];i;i=edge[i].nxt){
		int y=edge[i].to;
		if(y==fa)continue;
		dfs(y,x);
		dp[x][0]+=max(dp[y][0],dp[y][1]);
		dp[x][1]+=dp[y][0];
	}
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)fa[i]=i;
	for(int i=1;i<=n;i++){
		int x;
		scanf("%d%d",&atk[i],&x);
		if(find(i)!=find(x)){
			fa[i]=x; //fa[x]=i;
			add(i,x);
			add(x,i);
		}
		else q.push_back({i,x});
	}
	long long ans=0;
	for(int i=0;i<q.size();i++){
		int x=q[i].first,y=q[i].second;
		dfs(x,0);
		long long tmp=dp[x][0];
		dfs(y,0);
		tmp=max(tmp,dp[y][0]);
		ans+=tmp;
	}
	printf("%lld",ans);
	return 0;
} 

主函数输入时若 fa[i]=xfa[i]=x 则能AC,若 fa[x]=ifa[x]=i 则不过。为啥啊??

2023/3/22 15:51
加载中...