记录编号 478414 评测结果 AAAAAAAAAE
题目名称 [ZJOI 2008] 骑士 最终得分 90
用户昵称 Gravatartest 是否通过 未通过
代码语言 C++ 运行时间 0.477 s
提交时间 2017-12-11 13:21:32 内存使用 10.49 MiB
显示代码纯文本
#include<bits/stdc++.h>
#define ll long long
#define RG register
#define il inline
#define N 1000010
using namespace std;
struct ed{int nxt,to;}e[N];
int head[N],tot,n,fa[N],cnt;bool vis[N];
ll g[N],f[N],val[N];
pair<int,int> a[N];
int find(int x){if(fa[x]!=x)fa[x]=find(fa[x]);return fa[x];}
void LINK(int u,int v){e[tot].nxt=head[u];e[tot].to=v;head[u]=tot++;}
void link(int u,int v){LINK(u,v),LINK(v,u);}
void DP(int u,int faa){
  f[u]=val[u],g[u]=0;
  for(int i=head[u];i!=-1;i=e[i].nxt){
    int v=e[i].to;if(v==faa)continue;
    DP(v,u);
    f[u]+=g[v],g[u]+=max(f[v],g[v]);
  }
}
int main(){
  freopen("bzoj_1040.in","r",stdin);
  freopen("bzoj_1040.out","w",stdout);
  scanf("%d",&n);int v,x,y;
  memset(head,-1,sizeof(head));
  for(int i=1;i<=n;++i)fa[i]=i;
  for(int u=1;u<=n;++u){
    scanf("%lld%d",&val[u],&v);
    x=find(u),y=find(v);
    if(x!=y)link(u,v),fa[x]=fa[y];
    else a[++cnt]=make_pair(u,v);
  }ll ans(0),temp;
  for(int i=1;i<=cnt;++i){
    DP(a[i].first,a[i].first);temp=g[a[i].first];
    DP(a[i].second,a[i].second);temp=max(temp,g[a[i].second]);
    ans+=temp;   
  }printf("%lld",ans);
  return 0;
}