第10个点必须要吸氧才能过不知到为什么,时间复杂度是 O(n) 的,并查集维护环
查看原帖
第10个点必须要吸氧才能过不知到为什么,时间复杂度是 O(n) 的,并查集维护环
593595
_Aurore_楼主2022/10/25 21:59
#include<bits/stdc++.h>
#define int long long
#define MAXN 1000001
using namespace std;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();} 
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 
	return x*f; 
}
int n,a[MAXN],dad[MAXN];
int u[MAXN],v[MAXN],cnt;
int f[MAXN][2],ans;
vector<int> e[MAXN];
inline int find(int x){
	if(dad[x]==x) return x;
	return dad[x]=find(dad[x]);
}
void dfs(int x,int fa){
	f[x][0]=0;
	f[x][1]=a[x];
	for(register int i=0;i<e[x].size();i++)
	    if(e[x][i]!=fa){
	    	dfs(e[x][i],x);
	    	f[x][0]+=max(f[e[x][i]][1],f[e[x][i]][0]);
	    	f[x][1]+=f[e[x][i]][0];
		}
}
signed main(){
    n=read();
    for(register int i=1;i<=n;i++)
        dad[i]=i;
    for(register int i=1;i<=n;i++){
    	int x=read(),y=read();
    	int dx=find(i),dy=find(y);
    	a[i]=x;
    	if(dx==dy){
    		++cnt;
    		u[cnt]=i,v[cnt]=y;
		}
		else{
			dad[dx]=dy;
			e[i].push_back(y);
			e[y].push_back(i);
		}
	}
	for(register int i=1;i<=cnt;i++){
		int mx;
		dfs(u[i],0);
		mx=f[u[i]][0];
		dfs(v[i],0);
		mx=max(mx,f[v[i]][0]);
		ans+=mx;
	}
	cout<<ans;
	return 0;
}
2022/10/25 21:59
加载中...