90pts求助(点10时空双爆)
查看原帖
90pts求助(点10时空双爆)
499231
Jacky2009楼主2022/2/2 19:42
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct edge{
	int to,next;
}e[2000005];
int head[1000005],cnt=0;
long long ans=0;
vector<int>tmp[1000005];
void adde(int x,int y){
	cnt++;
	e[cnt].to=y;
	e[cnt].next=head[x];
	head[x]=cnt;
}
vector<int>lis;
int fa[1000005];
int find(int x){
	return x==fa[x]?fa[x]:find(fa[x]);
}
int vis[1000005], val[1000005], visit[1000005];
long long dp[1000005][2];
int li[1000005],c2=0;
int flag=0;
void tree_dp(int p,int pa,int bana,int banb){
	//cout<<p<<endl;
	visit[p]=1;
	for(int i=head[p];i!=-1;i=e[i].next){
		if(e[i].to==pa||visit[e[i].to]||(p==banb&&e[i].to==bana)||(p==bana&&e[i].to==banb))continue;
		tree_dp(e[i].to,p,bana,banb);
	//	cout<<e[i].to<<" "<<dp[e[i].to][0]<<" "<<dp[e[i].to][1]<<endl;
		dp[p][0]+=dp[e[i].to][1];
		dp[p][1]+=max(dp[e[i].to][0],dp[e[i].to][1]);
	}
	dp[p][0]+=val[p];
	return;
}
void dfs(int k,int pa){
//	cout<<"Flag="<<flag<<endl;
  //  cout<<k<<endl;
	if(flag)return;
	
 // cout<<"Start!\n";
	c2++;
	li[c2]=k;

		
	
		vis[k]=1;
//		cout<<"point "<<k<<" "<<pa<<endl;
		for(int i=head[k];i!=-1;i=e[i].next){
			if(e[i].to==pa)continue;
		//	cout<<k<<"->"<<e[i].to<<endl;
			if(vis[e[i].to]){
				memset(visit,0,sizeof(visit));
				memset(dp,0,sizeof(dp));
			//	cout<<"Search "<<k<<endl;
				tree_dp(k,-1,k,e[i].to);
				long long t=0;
				t=dp[k][1];
			//	cout<<"Search "<<e[i].to<<endl;
				memset(visit,0,sizeof(visit));
				memset(dp,0,sizeof(dp));
				tree_dp(e[i].to,-1,k,e[i].to);
				t=max(t,dp[e[i].to][1]);
				ans+=t;
				flag=1;
			//	cout<<"Out!"<<endl;
				return;
			}
			dfs(e[i].to,k);
			if(flag)return;
		}
	
	c2--;
//	cout<<"li.size()="<<c2<<endl;
}
signed main(){
	int n,m,tm;
	memset(head,-1,sizeof(head));
	cin>>n;
	tm=n;
	for(int i=1;i<=n;i++){
		fa[i]=i;
	}
	for(int i=1;i<=n;i++){
		int x,y;
		cin>>x>>y;
		val[i]=x;
		if(binary_search(tmp[i].begin(),tmp[i].end(),y))continue;
		tmp[i].push_back(y);
		tmp[y].push_back(i);
		adde(i,y);
		adde(y,i);
		
	//	cout<<i<<"->"<<y<<endl<<y<<"->"<<i<<endl;
		int fi=find(i),fy=find(y);
		if(fi!=fy){
			fa[max(fi,fy)]=min(fi,fy);
			tm--;
		}
	}
	for(int i=1;i<=n;i++){
	//	cout<<find(i)<<" ";
		lis.push_back(find(i));
	}
	sort(lis.begin(),lis.end());
	int lenl=unique(lis.begin(),lis.end())-lis.begin();
	for(int j=0;j<lenl;j++){
		int i=lis[j];
//		cout<<i<<":";
		c2=0;
		memset(vis,0,sizeof(vis));
		flag=0;
		dfs(i,-1);
		if(!flag){
	//		cout<<"search "<<i<<endl;
			tree_dp(i,-1,i,i);
			ans+=max(dp[i][0],dp[i][1]);
			memset(visit,0,sizeof(visit));
			memset(dp,0,sizeof(dp));
			
	//	cout<<"\nOver!"<<endl;
		}
	//	if(flag)cout<<"\nover!"<<endl;
	}
	cout<<ans;
}
2022/2/2 19:42
加载中...