洛谷 P3387 【模板】缩点

【题目链接】

洛谷 P3387 【模板】缩点

【题目考点】

1. 图论:强连通分量,有向图缩点
2. 图论:拓扑排序 有向无环图动规

【解题思路】

已知所有顶点点权是非负的,要想求出点权加和最大的路径。
如果该路径经过一个顶点u,那么必然应该经过顶点u所在强连通分量中的所有顶点,这样可以使得点权加和最大。

如果一条路径从顶点u进入u所在的强连通分量,从顶点v离开该强连通分量,但没有经过该强连通分量中的顶点x。由于允许多次经过一条边或者一个点,那么完全可以从顶点v,走回顶点x,再走回顶点v,这样多经过一个顶点x,点权加和一定变得更大或与之前相等。

因此可以将每个强连通分量可以看作一个顶点,只要经过该连通分量,就必然要经过该强连通分量中的所有顶点,增加的点权为该强连通分量中所有顶点的点权加和。

首先使用求强连通分量的算法(Kosaraju算法或Tarjan算法),求出有向图中的所有强连通分量
而后进行缩点,缩点后一定会得到一个有向无环图。
原图为e,设一个新图g,新图g中每个顶点相当于原图e中的一个强连通分量,新图g中每个顶点的权值是该顶点对应原图e中的强连通分量中所有顶点权值的和。如果原图e中顶点u到顶点v有一条有向边,同时u、v不属于同一个强连通分量,那么在新图g中,u所属强连通分量对应的顶点 到 v所属强连通分量对应的顶点有一条有向边。这样得到的新图g中可能有重边,不过重边不影响拓扑排序算法。

而后使用拓扑排序求有向无环图,也就是缩点后的g图中点权加和最大的路径,具体方法见该题:
ybt 1262:【例9.6】挖地雷

【题解代码】

解法1:Tarjan算法求强连通分量 缩点
#include<bits/stdc++.h>
using namespace std;
#define N 10005
int n, m, a[N], ga[N], dp[N], degIn[N], ans; 
int dfn[N], low[N], ts, scc[N], sn;//scc[i]:顶点i所在的强连通分量 sn:强连通分量数量 
vector<int> edge[N], g[N];
bool inStk[N];
stack<int> stk;
void tarjan(int u)
{dfn[u] = low[u] = ++ts;stk.push(u);inStk[u] = true;for(int v : edge[u]){if(dfn[v] == 0){tarjan(v);low[u] = min(low[u], low[v]);}else if(inStk[v])low[u] = min(low[u], dfn[v]);}if(dfn[u] == low[u]){int t;sn++;do{t = stk.top();scc[t] = sn;inStk[t] = false;stk.pop();} while(t != u);} 
}
void topoSort()
{queue<int> que;for(int v = 1; v <= sn; ++v) if(degIn[v] == 0){ dp[v] = ga[v]; que.push(v);}while(!que.empty()){int u = que.front();que.pop();for(int v : g[u]){dp[v] = max(dp[v], dp[u]+ga[v]);if(--degIn[v] == 0)que.push(v);}}
}
int main()
{int u, v;cin >> n >> m;for(int i = 1; i <= n; ++i)cin >> a[i];for(int i = 1; i <= m; ++i){cin >> u >> v;edge[u].push_back(v);}for(int i = 1; i <= n; ++i) if(dfn[i] == 0)tarjan(i);for(int u = 1; u <= n; ++u){ga[scc[u]] += a[u];for(int v : edge[u]) if(scc[u] != scc[v]){g[scc[u]].push_back(scc[v]);//可能会产生重边,不影响拓扑排序 degIn[scc[v]]++;//degIn[i]:连通分量i的入度}}topoSort();for(int v = 1; v <= sn; ++v)ans = max(ans, dp[v]);cout << ans;return 0;
}
解法2:Kosaraju算法求强连通分量 缩点
#include<bits/stdc++.h>
using namespace std;
#define N 10005
int n, m, a[N], ga[N], dp[N], degIn[N], ans; 
int dfn[N], low[N], ts, scc[N], sn;//scc[i]:顶点i所在的强连通分量 sn:强连通分量数量 
vector<int> edge[N], rg[N], g[N];
bool vis[N];
stack<int> stk;
void dfs_rg(int u)
{vis[u] = true;for(int v : rg[u]) if(!vis[v])dfs_rg(v);stk.push(u);
}
void dfs_g(int u)
{vis[u] = true;scc[u] = sn;for(int v : edge[u]) if(!vis[v])dfs_g(v);
}
void kosaraju()
{for(int u = 1; u <= n; ++u)	if(!vis[u])dfs_rg(u);memset(vis, 0, sizeof(vis));while(!stk.empty()){int u = stk.top();stk.pop();if(!vis[u]){++sn;dfs_g(u);}}
}
void topoSort()
{queue<int> que;for(int v = 1; v <= sn; ++v) if(degIn[v] == 0){ dp[v] = ga[v]; que.push(v);}while(!que.empty()){int u = que.front();que.pop();for(int v : g[u]){dp[v] = max(dp[v], dp[u]+ga[v]);if(--degIn[v] == 0)que.push(v);}}
}
int main()
{int u, v;cin >> n >> m;for(int i = 1; i <= n; ++i)cin >> a[i];for(int i = 1; i <= m; ++i){cin >> u >> v;edge[u].push_back(v);rg[v].push_back(u);}kosaraju();for(int u = 1; u <= n; ++u){ga[scc[u]] += a[u];for(int v : edge[u]) if(scc[u] != scc[v]){g[scc[u]].push_back(scc[v]);//可能会产生重边,不影响拓扑排序 degIn[scc[v]]++;//degIn[i]:连通分量i的入度}}topoSort();for(int v = 1; v <= sn; ++v)ans = max(ans, dp[v]);cout << ans;return 0;
}

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

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

相关文章

ArkTs组件(2)

一.下拉列表组件&#xff1a;Select 1.接口 Select(options: Array<SelectOption>) 参数名类型必填说明optionsArray<SelectOption>是设置下拉选项。 SelectOption对象说明 名称类型必填说明valueResourceStr是 下拉选项内容。 iconResourceStr否 下拉选项图片…

微机接口课设——基于Proteus和8086的打地鼠设计(8255、8253、8259)Proteus中Unknown 1-byte opcode / Unknown 2-byte opcode错误

原理图设计 汇编代码 ; I/O 端口地址定义 IOY0 EQU 0600H IOY1 EQU 0640H IOY2 EQU 0680HMY8255_A EQU IOY000H*2 ; 8255 A 口端口地址 MY8255_B EQU IOY001H*2 ; 8255 B 口端口地址 MY8255_C EQU IOY002H*2 ; 8255 C 口端口地址 MY8255_MODE EQU IOY003H*2 ; …

2024年12月一区SCI-加权平均优化算法Weighted average algorithm-附Matlab免费代码

引言 本期介绍了一种基于加权平均位置概念的元启发式优化算法&#xff0c;称为加权平均优化算法Weighted average algorithm&#xff0c;WAA。该成果于2024年12月最新发表在中JCR1区、 中科院1区 SCI期刊 Knowledge-Based Systems。 在WAA算法中&#xff0c;加权平均位置代表当…

实现某海外大型车企(T)Cabin Wi-Fi 需求的概述 - 4

大家好&#xff0c;我是Q&#xff0c;邮箱&#xff1a;1042484520qq.com。 今天我们在上几讲的基础上再扩展下 Cabin Wi-Fi 的功能需求&#xff0c;讲讲如何使能 5G TCU Wi-Fi STA Bridge 模式。 参考&#xff1a; 实现某海外大型车企&#xff08;T&#xff09;Cabin Wi-Fi 需求…

《CS2》报错dxgi.dll缺失怎么办?《CS2》游戏提示dxgi.dll缺失要怎么解决?

一、dxgi.dll缺失的根源 游戏安装问题&#xff1a;dxgi.dll文件是DirectX图形接口的一部分&#xff0c;如果游戏安装不完整或安装过程中出现问题&#xff0c;可能会导致该文件缺失。 系统更新或配置变动&#xff1a;Windows操作系统的更新或某些系统配置的变动&#xff0c;有时…

Level DB --- MemTable

MemTable是Level DB中重要的组件&#xff0c;它主要处理Level DB内存级别的增删查改。 基本数据结构 基础的存储数据结构如图1所示&#xff0c;这是一个存储单元的结构。其中1是internal key size&#xff0c;这里面包括两部分&#xff0c;一部分我们Level DB存储key-value中…

SDK 设备树创建

嘿嘿,好使 好使 好使 设备树相同的平台环境&#xff0c;但是细微差异的补充配置

【hackmyvm】Adroit靶机wp

tags: HMVjava反编译SQL注入 1. 基本信息^toc 文章目录 1. 基本信息^toc2. 信息收集3. java反编译4. sql注入5. 解密密码6. 提权 靶机链接 https://hackmyvm.eu/machines/machine.php?vmAdroit 作者 alienum 难度 ⭐️⭐️⭐️⭐️️ 2. 信息收集 ┌──(root㉿kali)-[~] └…

OSCP课后练习-tcpdump

本篇文章旨在为网络安全渗透测试行业OSCP考证教学。通过阅读本文&#xff0c;读者将能够对tcpdump日志分析关键信息过滤有一定了解 1、下载练习分析文件 wget https://www.offensive-security.com/pwk-online/password_cracking_filtered.pcap2、查看分析文件所有内容 sudo t…

Windows下C++使用SQLite

1、安装 进入SQLite Download Page页面&#xff0c;下载sqlite-dll-win-x86-*.zip、sqlite-amalgamation-*.zip、sqlite-tools-win-x64-*.zip三个包&#xff0c;这三个包里分别包含dll文件和def文件、头文件、exe工具。 使用vs命令行工具生成.lib文件&#xff1a;进入dll和def文…

文件上传绕过最新版安全狗

更多网安思路&#xff0c;可前往无问社区 http分块传输绕过 http分块传输⼀直是⼀个很经典的绕过⽅式&#xff0c;只是在近⼏年分块传输⼀直被卡的很死&#xff0c;很多waf都开始加 ⼊了检测功能&#xff0c;所以的话&#xff0c;分块传输这⾥也不是很好使&#xff0c;但是配…

搭建Elastic search群集

一、实验环境 二、实验步骤 Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎Elasticsearch目录文件&#xff1a; /etc/elasticsearch/elasticsearch.yml#配置文件 /etc/elasticsearch/jvm.options#java虚拟机 /etc/init.d/elasticsearch#服务启动脚本 /e…

正点原子串口例程解读

首先是串口初始化&#xff0c;这里初始化的是usart3 void esp8266_init(void) {huart_wifi.InstanceESP8266; //uart3huart_wifi.Init.BaudRate115200; // 设置波特率为115200huart_wifi.Init.WordLengthUART_WORDLENGTH_8B; // 设置数据位长度为8位huart_wifi.Init.StopBi…

KVM虚拟机管理脚本

思路&#xff1a; 在/opt/kvm下创建一个磁盘文件&#xff0c;做差异镜像&#xff0c;创建一个虚拟机配置文件&#xff0c;做虚拟机模版 [rootnode01 ~]# ls /opt/kvm/ vm_base.qcow2 vm_base.xml创建虚拟机的步骤&#xff1a;首先创建虚拟机的差异镜像&#xff0c;然后复制虚…

Null value was assigned to a property of primitive type setter of 的原因与解决方案

Null value was assigned to a property of primitive type setter of 的原因与解决方案 org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type setter of com.xxx.xxx.DealerUser.dealerId数据库表结构 实体类 当数据库的dealer…

【数据结构与算法】排序算法(下)——计数排序与排序总结

写在前面 书接上文&#xff1a;【数据结构与算法】排序算法(中)——交换排序之快速排序 文章主要讲解计数排序的细节与分析源码。之后进行四大排序的总结。 文章目录 写在前面一、计数排序(非比较排序)代码的实现&#xff1a; 二、排序总结 2.1、稳定性 3.2、排序算法复杂度及…

Multi移动端开发

Multi移动端开发 安装环境 安装功能 VS2022安装 【ASP.NET和Web开发】、【.NET Multi-platform App UI开发】、【.NET桌面开发】 配置程序源 【工具】–>【选项】–>【NuGet包管理器】–>【程序包源】&#xff0c;添加如下&#xff1a; 名称&#xff1a;MES_APP 源&…

若依plus apifox导入接口显示为空

项目已经正常启动 访问接口有些没问题&#xff0c;有些有问题 其他模块都可以正常导入 解决&#xff1a;

音视频入门基础:AAC专题(13)——FFmpeg源码中,获取ADTS格式的AAC裸流音频信息的实现

音视频入门基础&#xff1a;AAC专题系列文章&#xff1a; 音视频入门基础&#xff1a;AAC专题&#xff08;1&#xff09;——AAC官方文档下载 音视频入门基础&#xff1a;AAC专题&#xff08;2&#xff09;——使用FFmpeg命令生成AAC裸流文件 音视频入门基础&#xff1a;AAC…

英文学术会议海报poster模板【可编辑】

英文学术会议海报poster模板【可编辑】 下载链接&#xff1a;学术会议海报poster模板【可编辑】 横版海报 竖版海报 下载链接&#xff1a;学术会议海报poster模板【可编辑】 提供了一套学术海报的PPT模板&#xff0c;适用于学术会议、研讨会等场合。 竖版&#xff0c;包含11…