P5145 漂浮的鸭子
题目链接Miku
dfs每个点找环,但是要有一些特殊改造
标记每一个点需要在找完了之后标记
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<stack>
using namespace std;
long long n;
struct e{
long long f;
long long t;
long long ne;
long long v;
}ed[100001];
long long u,v;
stack <long long>s;
long long vis[1000001];
long long head[1000001];
long long p;
long long ans;
long long len;
long long i;
long long tim[1000001];
long long sum[1000001];
void add(long long f,long long to,long long v){
p++;
ed[p].f=f;
ed[p].t=to;
ed[p].ne=head[f];
ed[p].v=v;
head[f]=p;
}
long long cnt;
int j;
void shanchu(int u){
}
void dfs(long long now,long long t){
//cout<<now<<endl;
if(vis[now])
return ;
if(tim[now]!=0){
ans=max(ans,sum[t]-sum[tim[now]]);
return ;
}
tim[now]=t;
for(long long i=head[now];i;i=ed[i].ne){
sum[t+1]=sum[t]+ed[i].v;
dfs(ed[i].t,t+1);
}
vis[now]=1;
return ;
}
int main(){
scanf("%lld",&n);
for(long long i=1;i<=n;++i){
scanf("%lld%lld",&u,&v);
add(i,u,v);
}
for(long long i=1;i<=n;++i){
// memset(sum,0,sizeof(sum));
//if(!tim[i])
dfs(i,0);
}
cout<<ans;
return 0;
}