传球接力

来源:互联网 发布:手机耗电检测软件 编辑:程序博客网 时间:2024/04/30 11:35

给某位非常在意访问量的软妹同学打个广告

非常巧妙的一道题呢

上面是某同学写的题解
还是挺详细的

总之就是
删掉的同时加上长度
然后最后只会剩下环
然后再加起来
删掉进入这个点同时也在环上的边

#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>#include<cmath>#include<queue>#include<vector>#include<climits>#include<string>#include<cstdlib>#include<ctime>#define LL long long#define MOD 1000000007using namespace std;int n,i,j,a[500005],d[500005],rd[500005],vis[500005],cyc[500005],len,sum;int unrd[500005],rt,l,maxn[500005],k;LL ans;int main(){    scanf("%d",&n);    for(i=1;i<=n;i++)    {        scanf("%d%d",&a[i],&d[i]);        rd[a[i]]++;    }    for(i=1;i<=n;i++)        if(!rd[i]) unrd[++rt]=i;    while(l<rt)    {        k=unrd[++l];        maxn[a[k]]=max(maxn[a[k]],maxn[k]+d[k]);        if(--rd[a[k]]==0) unrd[++rt]=a[k];     }    for(i=1;i<=n;i++)        if(rd[i]&&!vis[i])        {            k=i;            len=0;            sum=0;            do            {                vis[k]=1;                cyc[++len]=k;                sum+=d[k];                k=a[k];            }while(k!=i);            for(j=1;j<=len;j++)                ans=max(ans,(LL)sum-d[cyc[j]]+maxn[a[cyc[j]]]);         }    printf("%lld",ans);    return 0;}