10pts救命
查看原帖
10pts救命
250461
SSSSSaber楼主2020/8/4 08:55

只有第三个点没wa

#include<bits/stdc++.h>
using namespace std;
int head[1010000],cnt,flag;
long long  p[1010000],n,x,y,dp[1010000][2],dp2[1010000][2];
bool vis[1010000];
struct edge{
	int from,to;
}e[6100000];
void add(int u,int v)
{
	e[++cnt].from=head[u];
	head[u]=cnt;
	e[cnt].to=v;
//	e[cnt].val=w;
}
void find(int u,int fa)
{
	for(int i=head[u];i;i=e[i].from)
	{
		//	if(flag)  去掉注释后运行不出来 
	//	{
	//		return ;
	//	}
		int v=e[i].to ;
		if(v==fa)
		{
			continue;
		}
	//	cout<<"v"<<v<<"u"<<u<<endl;
		if(vis[v])
		{
			x=u;
			y=v;
			flag=1;
			return ;
		}
		vis[v]=1;
		find(v,u);
	}
}
void dfs(int u,int fa,int no)
{
	for(int i=head[u];i;i=e[i].from )
	{
		int v=e[i].to ;
		if(v==fa)
		{
			continue;
		}
		if(v==no)
		{
			continue;
		}
		dfs(v,u,no);
		dp[u][1]+=dp[v][0];
		dp[u][0]+=max(dp[v][0],dp[v][1]);
	}
}
void dfs2(int u,int fa,int no)
{
	for(int i=head[u];i;i=e[i].from )
	{
		int v=e[i].to ;
		if(v==fa)
		{
			continue;
		}
		if(v==no)
		{
			continue;
		}
		dfs2(v,u,no);
		dp2[u][1]+=dp2[v][0];
		dp2[u][0]+=max(dp2[v][0],dp2[v][1]);
	}
}
void check()
{
	for(int i=1;i<=n;i++)
	{	cout<<dp[i][1]<<" "<<dp[i][0]<<endl; 
		//printf("dp[%d][0] %d  dp[%d][1] %d\n",i,dp[i][0],i,dp[i][1]);
	}
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>p[i];
		int go;
		cin>>go;
		add(i,go);
		add(go,i);
		dp[i][1]=p[i];
		dp2[i][1]=p[i];
	}//	
	long long ans=0;
	for(int i=1;i<=n;i++){
		if(!vis[i])
		{
			vis[i]=1;
			find(i,-1);  
		//	cout<<x<<y; 
			if(flag==1)
			{
				dfs(x,y,x);  
				//check();
				dfs2(y,x,y);
				ans+=max(dp[x][0],dp2[y][0]);//cout<<"here";
			}
			if(flag==0)
			{
				dfs(i,-1,-1);
				ans+=max(dp[i][1],dp[i][0]);
			}
			flag=0;
		}
	}
//	ans++;
	cout<<ans;
	return 0;
}
/*
9
20 4
25 5
15 4
26 5
41 6
10 2
10 8
20 9
30 7
*/
2020/8/4 08:55
加载中...