【图论】缩点的综合应用(一)

一.缩点的概念

 缩点,也称为点缩法(Vertex Contraction),是图论中的一种操作,通常用于缩小图的规模,同时保持了图的某些性质。这个操作的目标是将图中的一些节点合并为一个超级节点,同时调整相关边,以便保持图的连通性和其他性质。

具体步骤如下:

  1. 选择一个要缩点的节点:选择图中的一个节点,将它合并到另一个节点上。

  2. 合并节点:将选定的节点合并到另一个节点上,形成一个新的超级节点。通常情况下,选择入度或出度较小的节点进行合并,以减小新图的规模。

  3. 调整边:将与被合并节点相邻的边重新连接到新的超级节点上。注意要避免重复边和自环。

  4. 重复步骤1~3:继续选择节点进行缩点,直到不满足合并条件为止。

缩点操作通常用于算法设计和图分析中,有时可以用来简化图的复杂性,减少问题的规模。在一些情况下,缩点操作可能会破坏某些图的属性,因此在使用时需要谨慎考虑。此外,缩点操作后的图可能不再是原始问题的精确表示,可能会导致问题的近似解。


二.缩短的作用 

把一个环缩为一个超级点,可以由有环图-->DAG,从而更好的解决问题。

总之就是我们不想要环,直接缩为一个点,我们可以更好地解决问题,就就可以使用缩点法。


三.模板题

P3387 【模板】缩点 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)


四.思路

1.求点权之和最大,我们可以想到什么?最小生成树。

2.但这只需要解决一条路径的点权值最大,那可以怎么解决?拓扑+DP。

3.但是...拓扑只能解决DAG,这有环啊!!! 我们把环缩成一个超级点,然后再建一个新图不就行了吗?理论通过,实践开始!


五.实践

(1)tarjan缩点

主函数部分:

scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",&p[i]);}for(int i=1;i<=m;i++){int u,v;scanf("%d%d",&u,&v);add(u,v);}for(int i=1;i<=n;i++){if(!dfn[i]) tarjan(i);}

tarjan:

void tarjan(int u){dfn[u]=low[u]=++num;sta[++top]=u;ins[u]=1;for(int i=head[u];i;i=edge[i].next){int v=edge[i].v;if(!dfn[v]){tarjan(v);low[u]=min(low[u],low[v]);}else if(ins[v]){low[u]=min(low[u],dfn[v]);}}if(dfn[u]==low[u]){int j=0;while(1){j=sta[top--];ins[j]=0;h[j]=u; //j从此属于u if(j==u) break;p[u]+=p[j]; //点权值合并到第一个点(u点)上 }}
}

(2)重新建图

	for(int i=1;i<=m;i++){int u=h[edge[i].u],v=h[edge[i].v];if(u!=v){ //不在一个环 add2(u,v);in[v]++; //入度++,拓扑用 }}

(3)拓扑排序+DP

int topu(){queue<int> q;for(int i=1;i<=n;i++){ if(!in[i] && i==h[i]){q.push(i); //这是这条路径的起点 dp[i]=p[i];  //记得赋值 } }//拓扑基础 while(!q.empty()){int k=q.front(); q.pop();for(int i=head2[k];i;i=ed[i].next){int v=ed[i].v;dp[v]=max(dp[v],dp[k]+p[v]);in[v]--;if(!in[v]) q.push(v);}}//找最大值,不一定n就最大,毕竟不止一条路 int ans=0;for(int i=1;i<=n;i++){ans=max(ans,dp[i]);}return ans;
}


六.参考代码(完整代码)

#include<bits/stdc++.h>
#define maxn 100005
using namespace std;
int n,m;
int p[maxn];
struct Edge{int u,v,next;
}edge[maxn],ed[maxn];
int head[maxn],head2[maxn],cnt,cnt2;
void add(int u,int v){edge[++cnt]=(Edge){u,v,head[u]}; head[u]=cnt;
}
void add2(int u,int v){ed[++cnt2]=(Edge){u,v,head2[u]}; head2[u]=cnt2;
}
int dfn[maxn],low[maxn],num;
int sta[maxn],ins[maxn],top;
int lg,h[maxn]; //环的个数,成员属于哪个环 
void tarjan(int u){dfn[u]=low[u]=++num;sta[++top]=u;ins[u]=1;for(int i=head[u];i;i=edge[i].next){int v=edge[i].v;if(!dfn[v]){tarjan(v);low[u]=min(low[u],low[v]);}else if(ins[v]){low[u]=min(low[u],dfn[v]);}}if(dfn[u]==low[u]){int j=0;while(1){j=sta[top--];ins[j]=0;h[j]=u; //j从此属于u if(j==u) break;p[u]+=p[j]; //点权值合并到第一个点(u点)上 }}
}
int in[maxn],dp[maxn];
int topu(){queue<int> q;for(int i=1;i<=n;i++){ if(!in[i] && i==h[i]){q.push(i); //这是这条路径的起点 dp[i]=p[i];  //记得赋值 } }//拓扑基础 while(!q.empty()){int k=q.front(); q.pop();for(int i=head2[k];i;i=ed[i].next){int v=ed[i].v;dp[v]=max(dp[v],dp[k]+p[v]);in[v]--;if(!in[v]) q.push(v);}}//找最大值,不一定n就最大,毕竟不止一条路 int ans=0;for(int i=1;i<=n;i++){ans=max(ans,dp[i]);}return ans;
}
int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",&p[i]);}for(int i=1;i<=m;i++){int u,v;scanf("%d%d",&u,&v);add(u,v);}for(int i=1;i<=n;i++){if(!dfn[i]) tarjan(i);}for(int i=1;i<=m;i++){int u=h[edge[i].u],v=h[edge[i].v];if(u!=v){ //不在一个环 add2(u,v);in[v]++; //入度++,拓扑用 }}cout<<topu();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/49872.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LLM 生成式配置的推理参数温度 top k tokens等 Generative configuration inference parameters

在这个视频中&#xff0c;你将了解一些方法和相关的配置参数&#xff0c;这些参数可以用来影响模型在下一个词生成时的最终决策方式。如果你在Hugging Face网站或AWS的游乐场中使用过LLMs&#xff0c;你可能已经看到了这些控制选项&#xff0c;用来调整LLM的行为。每个模型都暴…

Java接口详解

接口 接口的概念 在现实生活中&#xff0c;接口的例子比比皆是&#xff0c;比如&#xff1a;笔记本上的USB口&#xff0c;电源插座等。 电脑的USB口上&#xff0c;可以插&#xff1a;U盘&#xff0c;鼠标&#xff0c;键盘等所有符合USB协议的设备 电源插座插孔上&#xff0c;…

【C++】—— 简述C++11新特性

序言&#xff1a; 从本期开始&#xff0c;我将会带大家学习的是关于C11 新增的相关知识&#xff01;废话不多说&#xff0c;我们直接开始今天的学习。 目录 &#xff08;一&#xff09;C11简介 &#xff08;二&#xff09;统一的列表初始化 1、&#xff5b;&#xff5d;初始…

百望云华为云共建零售数字化新生态 聚焦数智新消费升级

零售业是一个充满活力和创新的行业&#xff0c;但也是当前面临很大新挑战和新机遇的行业。数智新消费时代&#xff0c;数字化转型已经成为零售企业必须面对的重要课题。 8 月 20 日-21日&#xff0c;以“云上创新 韧性增长”为主题的华为云数智新消费创新峰会2023在成都隆重召…

爬虫selenium获取元素定位方法总结(动态获取元素)

目录 元素 查看元素信息 元素定位 通过元素id定位 通过元素name定位 通过xpath表达式定位 绝对路径 相对路径 通过完整超链接定位 通过部分链接定位 通过标签定位 通过类名进行定位 通过css选择器进行定位 id选择器 class选择器 标签选择器 属性选择器 定位带…

蓝帽杯半决赛2022

手机取证_1 iPhone手机的iBoot固件版本号:&#xff08;答案参考格式&#xff1a;iBoot-1.1.1&#xff09; 直接通过盘古石取证 打开 取证大师和火眼不知道为什么都无法提取这个 手机取证_2 该手机制作完备份UTC8的时间&#xff08;非提取时间&#xff09;:&#xff08;答案…

技术的巅峰演进:深入解析算力网络的多层次技术设计

在数字化时代的浪潮中&#xff0c;网络技术正以前所未有的速度演进&#xff0c;而算力网络作为其中的一颗明星&#xff0c;以其多层次的技术设计引领着未来的网络构架。本文将带您深入探索算力网络独特的技术之旅&#xff0c;从底层协议到分布式控制&#xff0c;为您呈现这一创…

opencv进阶19-基于opencv 决策树cv::ml::DTrees 实现demo示例

opencv 中创建决策树 cv::ml::DTrees类表示单个决策树或决策树集合&#xff0c;它是RTrees和 Boost的基类。 CART是二叉树&#xff0c;可用于分类或回归。对于分类&#xff0c;每个叶子节点都 标有类标签&#xff0c;多个叶子节点可能具有相同的标签。对于回归&#xff0c;每…

cuml机器学习GPU库 sklearn升级版AutoDL使用

CUML库 最近在做机器学习任务的时候发现我自己的数据集太大&#xff0c;直接用sklearn 跑起来时间很长&#xff0c;然后问GPT得知了有CUML库&#xff0c;后来去研究了一下&#xff0c;发现这个库只支持linux系统&#xff0c;从官网直接获取下载命令基本上也实现不了最后&#…

outlook等客户端报错:-ERR Login fail. Please using weixin token to login

使用outlook配置腾讯邮箱后&#xff0c;无法收取邮件&#xff0c;点击接收/发送所有文件夹&#xff0c; 提示报错&#xff1a; 任务“testqq.com - 正在接收”报告了错误(0x800CCC92):“电子邮件服务器拒绝您登录。请在“帐户设置”中验证此帐户的用户名及密码。 响应服务器:…

详细介绍线程池的使用原理、参数介绍、优点、常见构造方法、使用案例、模拟实现

前言 创建和销毁一个线程时&#xff0c;这点损耗是微不足道的&#xff0c;但是当需要频繁的创建和销毁多个线程时&#xff0c;这个成本是不可忽视的&#xff0c;于是就有大佬创建了线程池&#xff0c;借助线程池来减少其中的成本。 目录 前言 一、线程池的使用原理 二、线程…

LVS集群 (NET模式搭建)

目录 一、集群概述 一、负载均衡技术类型 二、负载均衡实现方式 二、LVS集群结构 一、三层结构 二、架构对象 三、LVS工作模式 四、LVS负载均衡算法 一、静态负载均衡 二、动态负载均衡 五、ipvsadm命令详解 六、搭建实验流程 一、首先打开三台虚拟机 二、…

【云计算】Docker特别版——前端一篇学会

docker学习 文章目录 一、下载安装docker&#xff08;一&#xff09;Windows桌面应用安装&#xff08;二&#xff09;Linux命令安装 二、windows注册登录docker三、Docker的常规操作(一)、基本的 Docker 命令(二)、镜像操作(三)、容器的配置(四)、登录远程仓库 四、镜像管理(一…

【FAQ】H.265视频无插件流媒体播放器EasyPlayer.js播放webrtc断流重连的异常修复

H5无插件流媒体播放器EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;可支持H.264与H.265编码格式&#xff0c;性能稳定、播放流畅&#xff0c;能支持WebSocket-FLV、HTTP-FLV&#xff0c;HLS&#xff08;m3u8&#…

Python功能制作之简单的3D特效

需要导入的库&#xff1a; pygame: 这是一个游戏开发库&#xff0c;用于创建多媒体应用程序&#xff0c;提供了处理图形、声音和输入的功能。 from pygame.locals import *: 导入pygame库中的常量和函数&#xff0c;用于处理事件和输入。 OpenGL.GL: 这是OpenGL的Python绑定…

如何声明一个全局变量?有什么注意事项?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 声明全局变量⭐ 注意事项⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚…

聊聊智慧城市的发展

目录 1.智慧城市应该是什么样子 2.智慧城市的实现方案 3.智慧城市会给人们造成的影响 1.智慧城市应该是什么样子 智慧城市是一种基于信息和通信技术的先进城市管理模式&#xff0c;旨在提高城市的运行效率、居民生活质量和可持续发展。智慧城市整合了各种智能设备、传感器、…

二叉树搜索

✅<1>主页&#xff1a;我的代码爱吃辣&#x1f4c3;<2>知识讲解&#xff1a;数据结构——二叉搜索树☂️<3>开发环境 &#xff1a;Visual Studio 2022&#x1f4ac;<4>前言&#xff1a;在之前的我们已经学过了普通二叉树&#xff0c;了解了基本的二叉树…

[Go版]算法通关村第十四关青铜——原来这就是堆

目录 堆的概念和特征父子关系&#xff1a;(i-1)/2 堆的构造过程自底向上堆化&#xff08;Bottom-up Heapify&#xff09;举例 自顶向下堆化&#xff08;Top-down Heapify&#xff09; 插入操作举例 删除操作举例 堆结构的价值口诀 堆的概念和特征 堆是一个很大的概念&#xff0…

ssm汽车养护管理系统源码和论文

ssm汽车养护管理系统038 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 开题报告内容&#xff1a;&#xff08;研究现状、目的意义&#xff1b;基本内容、研究方法、参考文献等。&#xff09; 研究现状 国外…