首页 > 其他分享 >[ZJOI2008] 骑士

[ZJOI2008] 骑士

时间:2024-10-09 20:33:22浏览次数:8  
标签:int son vector ZJOI2008 骑士 root find dp

\(基环树DP\)
https://www.luogu.com.cn/problem/P2607
\(将基环树上面的环破开成树 就能进行如同《没有上司的舞会》的树形DP\)
\(没有上司的舞会:\)https://www.luogu.com.cn/problem/P1352
\(具体实现困难之处在于如何破环成树,其实只需要主要到对于树上的一个环,将环上的两个节点记录就能算出树的不同选取方式的最大值\)
\(在下方代码中的find用于找到两个不同的根节点 对其进行dfs 因为是单向边 所以只需要保证环不会回到自己即可\)
code:

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
#define pb push_back()
const int N = 1e5 + 10;

void solve() {
    int n;cin>>n;
    vector dp(n+1,vector<int>(2));
    vector G(n+1,vector<int>());
    int r1,r2;
    vector<int>vis(n+1),w(n+1);
    for(int i=1,x;i<=n;i++){
        cin>>w[i]>>x;
        G[x].push_back(i);
    }
    function<void(int,int)>find=[&](int x,int root){
        vis[x]=1;
        for(auto &son:G[x]){
            if(son==root){
                r1=x;
                r2=son;return;
            }
            if(vis[son])continue;
            find(son,root);
        }
    };
    function<int(int,int)>dfs=[&](int x,int root){
        dp[x][0]=0,dp[x][1]=w[x];
        for(auto &son:G[x]){
            if(son==root)continue;
            dfs(son,root);
            dp[x][0]+=max(dp[son][1],dp[son][0]);
            dp[x][1]+=dp[son][0];
        }
        return dp[x][0];
    };
    int sum=0;
    for(int i=1;i<=n;i++){
        if(vis[i])continue;
        r1=r2=0;
        find(i,i);
        if(r1){
            int res1=dfs(r1,r1);
            int res2=dfs(r2,r2);
            sum+=max(res1,res2);
        }
    }
    cout<<sum;
}

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

    solve();
}

标签:int,son,vector,ZJOI2008,骑士,root,find,dp
From: https://www.cnblogs.com/archer233/p/18455088

相关文章

  • 白骑士的JavaScript教学JavaScript语法基础篇之运算符与表达式 2.2.4 逻辑运算符
            逻辑运算符是用于布尔逻辑运算的符号,它们常用于控制流程和条件判断,帮助程序员编写更复杂和更动态的条件语句。在JavaScript中,主要的逻辑运算符包括逻辑与(‘&&‘)、逻辑或(‘||‘)、逻辑非(‘!‘)以及一些其他特定场景的运算符。逻辑运算符用于将多个布尔值或表达式......
  • 白骑士的JavaScript教学JavaScript语法基础篇之运算符与表达式 2.2.5 条件运算符(三元
            条件运算符,也称为三元运算符,是JavaScript中唯一的三目运算符,它提供了一种简洁的方式来编写条件判断和赋值语句。通过使用条件运算符,你可以在一行代码中实现简单的条件判断,从而让代码更加紧凑和易读。条件运算符        条件运算符由三个部分组成:条件......
  • 白骑士的Java教学安全编程篇 12.4 SSL/TLS在Java中的应用
            SSL(SecureSocketsLayer)和TLS(TransportLayerSecurity)是用于保护网络通信安全的协议,广泛应用于互联网中的数据传输。Java提供了强大的API来实现SSL/TLS通信,确保数据在传输过程中不被窃听和篡改。本篇博客将详细介绍SSL/TLS的基本概念及其在Java中的应用,包括......
  • 白骑士的Java教学安全编程篇 12.3 数据加密与解密
            在现代应用程序开发中,数据的安全传输和存储至关重要。数据加密与解密技术是保障数据安全的核心手段,能够有效防止敏感信息被非法窃取和篡改。本篇博客将详细介绍Java中常用的数据加密与解密方法,包括对称加密、非对称加密、散列函数以及数字签名等,帮助你掌握数据......
  • P3355 骑士共存问题
    P3355骑士共存问题我还没学网络流所以先讲二分图的做法,讲述下思路怎么推出来的。可以发现骑士可达的点的颜色总是与自己的颜色相反,放了这个骑士,周围可达的方格就不能放骑士,要求客房的最多骑士数量,发现这与二分图最大匹配是相同的,所以直接进行分点匹配。#include<bits/stdc++.......
  • 《勇敢小骑士》游戏闪退弹窗提示“找不到kernel.dll”文件该怎么解决?游戏启动时崩溃提
    当玩《勇敢小骑士》游戏出现闪退并弹窗提示“找不到kernel.dll”文件时,可以在网上搜索可靠的该文件资源进行下载,然后放置到合适的系统目录中。也可尝试检查游戏完整性,看能否自动修复此问题。本篇将为大家带来《勇敢小骑士》游戏闪退弹窗提示“找不到kernel.dll”文件该怎么解决......
  • 白骑士的Java教学介绍篇 1.1 Java简介
            欢迎来到Java编程的世界!无论你是编程新手还是有一定经验的开发者,学习Java都将为你打开一个广阔的编程领域。Java作为一种功能强大且广泛使用的编程语言,自诞生以来便以其平台无关性、面向对象的特性和丰富的生态系统赢得了全球开发者的青睐。在本篇博客中,我们将......
  • 白骑士的CSS高级篇之CSS Grid布局进阶 4.1.2 网格模板与区域
            CSSGrid布局是CSS中强大的布局系统之一,它提供了更灵活和更高效的方式来创建复杂的网页布局。通过Grid布局,你可以将网页划分为多个网格区域,并在这些区域中放置内容,这使得布局更加直观和易于维护。本文将深入探讨Grid布局中的网格模板和区域的概念,帮助你掌握如......
  • 白骑士的CSS教学进阶篇之变形与过渡 3.1.3 动画
            CSS动画允许开发者在网页中创建复杂的动态效果,而不需要依赖JavaScript。通过使用‘@keyframes‘规则定义动画的关键帧,以及‘animation‘属性来控制动画的行为和效果,你可以实现从简单到复杂的各种动画效果。以下内容将详细讲解CSS动画的各个部分,包括‘......
  • 白骑士的CSS教学进阶篇之变形与过渡 3.1.2 过渡效果
            在CSS中,过渡效果(transition)允许你在属性值发生变化时平滑过渡,使变更过程更加自然和动感。使用过渡效果可以改善用户体验,使页面在变化时看起来更加流畅。通过设置‘transition‘属性,你可以控制过渡的属性、持续时间、时间函数和延迟等。这一节将详细介绍‘......