记录编号 370285 评测结果 AAAAAAAAAE
题目名称 [ZJOI 2008] 骑士 最终得分 90
用户昵称 GravatarCydiater 是否通过 未通过
代码语言 C++ 运行时间 1.439 s
提交时间 2017-02-13 09:50:34 内存使用 122.38 MiB
显示代码纯文本
//BZOJ1040
//by Cydiater
//2017.2.13
#include <iostream>
#include <map>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <string>
#include <iomanip>
#include <ctime>
#include <cmath>
#include <algorithm>
#include <queue>
#include <bitset>
#include <set>
#include <vector>
#include <complex>
using namespace std;
#define ll long long
#define up(i,j,n)	for(int i=j;i<=n;i++)
#define down(i,j,n)	for(int i=j;i>=n;i--)
#define cmax(a,b)	a=max(a,b)
#define cmin(a,b)	a=min(a,b)
#define Auto(i,node)	for(int i=LINK[node];i;i=e[i].next)
#define FILE		"bzoj_1040"
const int MAXN=1e6+5;
const int oo=0x3f3f3f3f;
inline int read(){
	char ch=getchar();int x=0,f=1;
	while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
int N,LINK[MAXN],dfn[MAXN],low[MAXN],dfs_clock=0,stack[MAXN],top=0,NN,len=0;
struct edge{
	int y,next;
}e[MAXN<<1];
ll val[MAXN],f[MAXN][2],arr[MAXN][2],g[MAXN][2][2],ans=0;
vector<int>E[MAXN<<1];
namespace solution{
	inline void insert(int x,int y){e[++len].next=LINK[x];LINK[x]=len;e[len].y=y;}
	inline void Insert(int x,int y){insert(x,y);insert(y,x);}
	void Prepare(){
		N=read();
		up(i,1,N){
			val[i]=read();int y=read();
			Insert(i,y);
		}
		NN=N;
	}
	void Tarjan(int node){
		dfn[node]=low[node]=++dfs_clock;
		stack[++top]=node;
		Auto(i,node)if(!dfn[e[i].y]){
			Tarjan(e[i].y);
			cmin(low[node],low[e[i].y]);
			if(low[e[i].y]>=dfn[node]){
				NN++;int tmp;
				do{
					tmp=stack[top--];
					E[NN].push_back(tmp);
				}while(tmp!=e[i].y);
				E[node].push_back(NN);
			}
		}else cmin(low[node],dfn[e[i].y]);
	}
	void TreeDP(int node){
		int siz=E[node].size();
		f[node][0]=f[node][1]=0;
		if(node>N){
			up(i,0,siz-1)TreeDP(E[node][i]);
			//cout<<node<<' '<<siz+1<<endl;
			up(i,0,siz-1){
				arr[i][0]=f[E[node][i]][0];
				arr[i][1]=f[E[node][i]][1];
				g[i][0][0]=g[i][0][1]=g[i][1][0]=g[i][1][1]=0;
			}
			g[siz][0][0]=g[siz][0][1]=g[siz][1][0]=g[siz][1][1]=0;
			arr[siz][0]=arr[siz][1]=0;
			//up(i,0,siz)cout<<arr[i][0]<<' '<<arr[i][1]<<"| ";
			//cout<<endl;
			g[0][1][1]=arr[0][1];
			g[0][0][0]=arr[0][0];
			up(i,1,siz){
				up(j,0,1){
					cmax(g[i][0][j],g[i-1][0][j]+arr[i][0]);
					cmax(g[i][0][j],g[i-1][1][j]+arr[i][0]);
					cmax(g[i][1][j],g[i-1][0][j]+arr[i][1]);
				}
			}
			f[node][0]=max(g[siz][0][0],g[siz][0][1]);
			f[node][1]=g[siz][1][0];
			//cout<<f[node][0]<<' '<<f[node][1]<<endl<<endl;
		}else{
			up(i,0,siz-1){
				TreeDP(E[node][i]);
				f[node][0]+=max(f[E[node][i]][0],f[E[node][i]][1]);
				f[node][1]+=f[E[node][i]][1];
			}
			f[node][1]+=val[node];
		}
	}
	void Solve(){
		up(i,1,N)if(!dfn[i]){
			Tarjan(i);
			TreeDP(i);
			ans+=max(f[i][0],f[i][1]);
		}
		cout<<ans<<endl;
	}
}
int main(){
	//freopen("input.in","r",stdin);
	freopen(FILE".in","r",stdin);
	freopen(FILE".out","w",stdout);
	using namespace solution;
	Prepare();
	Solve();
	return 0;
}