首页 > 编程语言 >【算法学习】基环树

【算法学习】基环树

时间:2024-10-29 19:21:23浏览次数:4  
标签:fa int 学习 基环树 算法 树形 骑士 dp

基环树

基环树就是类似于在树上加了一条边形成了环,去点环上的一条边后就会变成数,如下图。

image

这是一个 \(n\) 个点 \(n\) 条边的连通图,如果不保证联通,它就会成为基环树森林。

外向树:每个点都只有一条入边,因为向内上。

内向树:每个点都只有一条出边,因为向外少。

怎么用呢?

因为有环的性质,所以可以将环拆成树,再对树继续树形dp即可。

例题

P2607 [ZJOI2008] 骑士

因为一个骑士只会讨厌另外一个骑士,所以每个连通块都是一颗基环树,所以我们对每颗基环树拆环成树进行树形dp即可。

我们可以把图建成一个有向图,他讨厌的骑士作他的父亲,因为我们环上相邻的两个点都不能选,所以我们先强制不选根节点进行一遍树形dp,状态为f[x][1/0]表示选/不选x节点最大的权值,然后再对根节点的父亲进行一遍树形dp,这样就包含了所有情况了!!

#include <bits/stdc++.h>
#define re register 
const int N=1e6+1e5;
#define int long long
const int inf=1e9;
using namespace std;
int n;
vector<int> v[N];
int vis[N];
int f[N][3];
int fa[N];
int a[N];
int ans=0;
int mx=0;
int root=1;

void dfs(int x){
	vis[x]=1;
	f[x][0]=0;
	f[x][1]=a[x];
	for(int i:v[x]){
		if(i!=root){
			dfs(i);
			f[x][0]+=max(f[i][1],f[i][0]);
			f[x][1]+=f[i][0];
		}
		else{
			f[i][1]=-inf;
		}
	}
} 

signed main(){
    ios::sync_with_stdio(false);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i]>>fa[i];
		v[fa[i]].push_back(i);
	}
	for(int i=1;i<=n;i++){
		if(!vis[i]){
			vis[i]=1;
			mx=0;
			root=i;
			while(!vis[fa[root]]){
				vis[root]=1;
				root=fa[root];
			}
			vis[root]=1;
			dfs(root);
			mx=max(f[root][1],f[root][0]);
			root=fa[root];
			dfs(root);
			ans+=max(mx,max(f[root][1],f[root][0]));
		}
	}
	cout<<ans;
    return 0;
}

标签:fa,int,学习,基环树,算法,树形,骑士,dp
From: https://www.cnblogs.com/sadlin/p/18514214

相关文章

  • 深度学习入门笔记——DataLoader的使用
    如何使用数据集DataSet?在介绍DataLoader之前,需要先了解数据集DataSet的使用。Pytorch中集成了很多已经处理好的数据集,在pytorch的torchvision、torchtext等模块有一些典型的数据集,可以通过配置来下载使用。以CIFAR10数据集为例,文档已经描述的很清晰了,其中要注意的就是transform......
  • 数据库对视图的学习
    视图目录视图什么是视图视图的作用视图操作创建视图更新视图查看视图删除视图视图规则与限制什么是视图MySQL中的视图(View)是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含行和列,但视图本身不包含数据。视图中的数据是存储在基础表中的数据。视图的作用简化复杂查询:......
  • 学期2024-2025-1 学号20241424 《计算机基础与程序设计》第6周学习总结
    学期2024-2025-1学号20241424《计算机基础与程序设计》第6周学习总结作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计)这个作业要求在哪里(如2024-2025-1计算机基础与程序设计第六周作业这个作业的目标<参考上面的学习总结模板,把学习过程通过博客......
  • 明星人脸识别基于VGG、MTCNN、RESNET深度学习卷积神经网络应用|附数据代码
    全文链接:https://tecdat.cn/?p=38046原文出处:拓端数据部落公众号分析师:XinzuDu 人脸识别技术作为生物特征识别技术的重要组成部分,在近三十年里得到了广泛的关注和研究,已经成为计算机视觉、模式识别领域的研究热点。然而由于存在光线、背景、人脸遮挡等问题,如何准确识别出人......
  • Python小白学习教程从入门到入坑------第十八课 异常模块与包【下】(语法基础)
    一、内置全局变量__name__在Python中,有一些内置的全局变量和特殊变量,它们是由Python解释器预定义的,可以在代码的任何地方直接使用。这些变量通常用于提供关于当前解释器状态的信息,或者用于控制解释器的行为在Python中,__name__是一个内置的特殊变量,也被称为“魔法变量”或“......
  • 银行信贷风控专题:Python、R 语言机器学习数据挖掘应用实例合集:xgboost、决策树、随机
    全文链接:https://tecdat.cn/?p=38026原文出处:拓端数据部落公众号分析师:FanghuiShao 在当今金融领域,风险管控至关重要。无论是汽车贷款违约预测、银行挖掘潜在贷款客户,还是信贷风控模型的构建,以及基于决策树的银行信贷风险预警,都是金融机构面临的关键挑战。本银行信贷风控专题......
  • 算法:查找
    算法1.顺序查找和折半查找1.1顺序查找1.2折半查找1.3索引顺序查找2.树表查找2.1查找2.2插入3.哈希表及哈希查找3.1哈希造表3.2处理冲突开放定址法链地址法3.3哈希查找查找是非数值数据处理中一种基本运算,查找运算的效率与查找表所采用的数据结构和查找......
  • 个人学习React Native的实际意义探讨
        ReactNative(以下简称RN)是一个跨平台框架,它是由facebook公司基于React实现的移动端跨平台开发框架。目前比较流行的跨平台开发框架除了RN,还有一个就是Flutter。随着Flutter的兴起和后来居上,使得RN没有前几年那么吃香了。那么除了技术上的比较外,个人学习RN有什么必......
  • HTML学习笔记三
    系列笔记目录第一章HTML的概述第二章URL简介第三章网页元素的属性网页元素的属性系列笔记目录前言一、简介二、全局属性1.id2.class3.title4.tabindex5.accesskey6.style7.hidden8.lang,dir9.contenteditable10.spellcheck11.data-属性12.事件处理属......
  • Vue学习笔记(十)
    5模板字符串ES6支持模板字符串,使得字符串的拼接更加的简洁、直观。不使用模板字符串:在ES5中字符串拼接通过【+】实现letfirst="张";letlast="四";letname='Yournameis'+first+''+last+'.''使用模板字符串:ES6中使用反引号【``】来拼接字符串,......