[题解]P3119 [USACO15JAN] Grass Cownoisseur G

news/2024/11/13 18:35:05/文章来源:https://www.cnblogs.com/Sinktank/p/18544498

P3119 [USACO15JAN] Grass Cownoisseur G

显然我们可以先跑强连通分量,由\(x\)个点缩成的新点\(u\)权值为\(v[u]=x\)

下文中的节点\(1\)均表示缩点后节点\(1\)所在的节点。

我们在缩点后的DAG上跑拓扑排序,预处理出\(fa[i]\)\(fb[i]\),分别表示“\(1\)\(i\)路径的点权和”,“\(i\)\(1\)路径的点权和”,后者可以建反图求解。

我们应该找到节点\(u,v\)使得:

  • \(1\)可以到达\(u\)
  • \(u\)\(v\)有边
  • \(v\)可以到达\(v\)

这样一个合法的路径(\(1\)\(u\)\(u\)逆行到\(v\)\(v\)\(i\))就产生了,用\(fa[u]+fb[v]-v[1]\)更新答案即可。

注意,如果整个图是一个强连通分量,缩点后会只剩\(1\)个点,需要提前用\(v[1]\)更新答案,否则无法通过Subtask #1。

时间复杂度\(O(n+m)\)

点击查看代码
#include<bits/stdc++.h>
#define N 100010
using namespace std;
int n,m,dfn[N],low[N],tim,st[N],top,ans;
int v[N],ori[N],dega[N],degb[N],fa[N],fb[N];
bitset<N> in_stack;
vector<int> G[N],Ga[N],Gb[N];
queue<int> q;
void tarjan(int u){dfn[u]=low[u]=++tim;st[++top]=u,in_stack[u]=1;for(int i:G[u])if(!dfn[i])tarjan(i),low[u]=min(low[u],low[i]);else if(in_stack[i])low[u]=min(low[u],dfn[i]);if(dfn[u]==low[u]){while(1){int t=st[top--];in_stack[t]=0,ori[t]=u,v[u]++;if(t==u) break;}}
}
void topo(vector<int> G[],int deg[],int f[N],int s){for(int i=1;i<=n;i++) if(!deg[i]) q.push(i);memset(f,0,sizeof(int));while(!q.empty()){int u=q.front();q.pop();if(u==s||f[u]) f[u]+=v[u];for(int i:G[u]){f[i]=max(f[i],f[u]);deg[i]--;if(!deg[i]) q.push(i);}}
}
signed main(){ios::sync_with_stdio(false);cin.tie(nullptr),cout.tie(nullptr);cin>>n>>m;for(int i=1,u,v;i<=m;i++){cin>>u>>v;G[u].emplace_back(v);}for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);ans=v[ori[1]];for(int i=1;i<=n;i++){for(int j:G[i]){if(ori[i]!=ori[j]){Ga[ori[i]].emplace_back(ori[j]);Gb[ori[j]].emplace_back(ori[i]);dega[ori[j]]++,degb[ori[i]]++;}}}topo(Ga,dega,fa,ori[1]);topo(Gb,degb,fb,ori[1]);for(int i=1;i<=n;i++){if(!fb[i]) continue;for(int j:Ga[i]){if(!fa[j]) continue;ans=max(ans,fb[i]+fa[j]-v[ori[1]]);}}cout<<ans<<"\n";return 0;
}

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

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

相关文章

Vulnhub W1R3S: 1.0.1

Vulnhub W1R3S: 1.0.1 0x01:端口扫描 主机发现,靶机ip:192.168.231.133 nmap -sn 192.168.231.0/24-sn 仅主机扫描 /24 扫描c段详细全端口扫描 nmap -sT -sC -sV -O -p21,22,80,3306 192.168.231.133 -oA /root/scan/1/-sT: 以TCP进行扫描; -sC:使用 nmap 的默认脚本集合进…

永宏BI 自定义绘图(环状图)

结果样式:绑定数据:自定义JS代码:点击查看代码 option = {tooltip: {trigger: item,formatter: {a} <br/>{b}: {c} ({d}%)},series: [{type: pie,radius: [50%, 70%],avoidLabelOverlap: false,label: {show: false,position: center},emphasis: {label: {show: false…

Privilege Escalation(权限提升)

Privilege Escalation(权限提升) What the Shell? What is a shell shell 是我们与命令行环境 (CLI) 交互时使用的工具。换句话说, Linux中常见的 bash 或 sh 程序都是 shell 的例子,Windows 上的 cmd.exe 和 Powershell 也是如此。 简而言之,我们可以强制远程服务器向我们…

30 秒!用通义灵码画 SpaceX 星链发射流程图

30 秒!用通义灵码画 SpaceX 星链发射流程图不想读前人“骨灰级”代码, 不想当“牛马”程序员, 想像看图片一样快速读复杂代码和架构? 来了,灵码又加新 buff!!通义灵码支持代码逻辑可视化, 可以把你的每段代码画成流程图。 你可以把它当成一个超级脑图工具, 帮你快速画…

大模型--Megatron TP张量并行-15

目录1. 参考2. 介绍3. 权重的切分3.1 按行切分权重3.2 按列切分权重4. MLP层5. Self-Attention层6. Embedding层7. Cross-entropy层8. 张量模型并行 + 数据并行 1. 参考 https://zhuanlan.zhihu.com/p/622212228 2. 介绍 流水线并行 数据并行(DP,DDP和ZeRO) 介绍最重要,也是…

FreeModbus RTU 从机Hal库裸机移植避坑指南

首先说明 : FreeModbus 有很多个库!!!! 不同库的实现方法是略有不同的!!! 本次 FreeModbus RTU 移植 主要依据 这个网友分享的工程他人移植的库 你可能会在csdn看到他的文章, 但是完全跟着那个文章走很混乱 而且跟库的文件不一样. 故而 我重新整理了工程, 并写了一个详细的移植…

修改 NIKKE PC 端游戏缓存位置

本文记录如何使用 mklink 命令修改 NIKKE PC 端游戏缓存位置前言 NIKKE 每次版本更新都要下载大约 5~10G 的数据,以至于成为了我 AFK 的一部分原因 [允悲] 但是看游戏安装目录的大小却只有 1G 多,我还奇怪数据存哪去了,看到越来越小的 C 盘的空间才明白,草 搜索了一下后立马…

导包不对如何解决

问题: 这里这个包是自动导入的我们并不需要这个时候导致下面代码报错如何解决 2.解答:比如下面这给词爆红我们需要alt+enter,IDEA 会显示一个选择框,允许您选择 okhttp3.Request。选中后,它将使用您指定的正确包。,这里就是我是重新导入了maven依赖就好了

一图看懂云消息队列 RabbitMQ 版对比开源优势

随着企业对消息队列的性能和稳定性要求越来越高,运维成本也随之增加。 云消息队列 RabbitMQ 版通过架构优化:避免了消息积压导致的内存泄漏和服务器故障等稳定性问题; 解决了分布式系统中的脑裂难题; 并支持弹性伸缩和按量计费,有效降低资源和运维成本!那么,与开源 Rabb…

GIS工具哪家强?五款优质GIS工具箱对比分析

本文将为大家介绍五款功能各异的GIS工具箱,包括GISBox、QGIS、MapTiler、Saga GIS和Whitebox GAT。每款工具箱都有其独特的功能和应用场景,能够满足不同类型的GIS任务需求。无论是数据处理、空间分析、影像处理还是可视化需求,这些工具都能为用户提供丰富的解决方案。本文将…