Discuz! Board

 找回密码
 立即注册
查看: 584|回复: 1

每日一题6.13(基环树dp)

[复制链接]

9

主题

15

回帖

160

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
160

黄金骑士钻石大师

发表于 2025-6-6 01:14:10 | 显示全部楼层 |阅读模式

6

主题

20

回帖

122

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
122

黄金骑士

发表于 2025-7-4 16:31:20 | 显示全部楼层
[C++] 纯文本查看 复制代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve(){
    int n;
    cin>>n;

    vector<int>fa(n+1);
    iota(fa.begin(),fa.end(),0);
    vector<int>a(n+1);
    vector<vector<int>>adj(n+1);

    auto find=[&](auto &&find,int x){
        if(x==fa[x]) return x;
        return fa[x]=find(find,fa[x]);
    };

    auto merge=[&](int x,int y){
        fa[find(find,x)]=find(find,y);
    };

    vector<array<int,2>>p;
     
    
    for(int i=1;i<=n;i++){
        int x;
        cin>>a[i]>>x;

        if(find(find,i)==find(find,x)){
            p.push_back({i,x});
            continue;
        }
        
        merge(x,i);
        adj[x].push_back(i);
        adj[i].push_back(x);

    }
    
    vector<array<int,2>>dp(n+1);
    int ans=0;

    auto dfs=[&](auto dfs,int u,int pa )->void{
        dp[u][0]=0;
        dp[u][1]=a[u];

        for(auto v:adj[u]){
            if(v==pa) continue;
            dfs(dfs,v,u);

            dp[u][1]+=dp[v][0];
            dp[u][0]+=max(dp[v][0],dp[v][1]);
        }
      
    };

    for(auto r:p){
        int r1=r[0],r2=r[1];
        int res=0;
        dfs(dfs,r1,0);
        int res1=dp[r1][0];
        dfs(dfs,r2,0);
        int res2=dp[r2][0];
        ans+=max(res1,res2);
    }
    cout<<ans<<'\n';
}


signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);

    int t=1;
    //cin>>t;

    while(t--){
        solve();
    }


    return 0;
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|DiscuzX ( 鄂ICP备2024088332号-1 )

GMT+8, 2025-7-23 17:57 , Processed in 0.052636 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表