P8269 [USACO22OPEN] Visits S

news/2025/10/28 20:29:19/文章来源:https://www.cnblogs.com/qwqSW/p/19172621

题目传送门

博客传送门

首先,每头牛牛都只有一个拜访对象,所以如果考虑图论建模的话,相当于每个点出度都是 1。这相当于图是个基环树森林(注意不只有一棵基环树),而且每个基环树都是内向基环树。

而且我们注意到有个特殊点,建出来的图是很多个环,就更加坚定了我们往基环树那块考虑的想法。我们把一个基环树的图画出来:

P8269_1_1

(很像你妈妈的钥匙串有木有)

然后转换一下原题的题意。既然决定图论建模了,那原题的 \(a_i\) 就相当于 \(i -> a_i\) 建边,边权是 \(v_i\)。至于排列,其实就是个行动顺序表,问我们如何安排行动顺序会让最终贡献最大。

对于不在环里的节点,显然不断让入度为 0 的点行动是更优的。首先一个点出去拜访以后就不可能回来,其次对于下图的情况,先让连向 \(v\) 的点拜访 \(v\),然后 \(v\) 再去拜访别人,比先让 \(v\) 拜访别人,多了 \(w_1+w_2+\cdots+w_k\) 的贡献。

P8269_2_1

所以对于环外的部分,直接贪心地进行拓扑排序,累加边权即可。

这样我们就只剩下基环树森林里仅存的几个环了。

P8269_3_1

对于一个环来说,显然你是注定无法让它们都能统计贡献的。你可以自己在脑子里想象这些点逐个移动到它的拜访点,然后你就会发现注定有一个点的拜访点已经挪走了。

刚才那一通模拟后你还能得到,如果这个环有 \(m\) 条边,那你一定可以统计 \(m-1\) 条边的贡献,而且这样一定是比 \(m-2\) 条边或者更往下的情况更优。那些情况一定是如下的图所展示的:

P8269_4_1

也就是 1->2,2->3,4->5,3->4,5->1。那你一定不如 1->2,2->3,3->4,4->5,5->1 或是 4->5,5->1,1->2,2->3,3->4 优。

既然这样,那就相当于我们要在这个环上舍弃一条边。贪心一下,我们舍弃这个环上的最小边。这棵基环树的贡献就是它边权的总和减掉被舍弃的边之边权。

注意原图里有多个基环树,也会有多个环,要将它们被舍弃的边求一个 sum,然后统一减掉。

代码:

P8269
#include<bits/stdc++.h>
#define int long long
using namespace std;inline int read(){int x=0,f=1;char c=getchar();while(c<48){if(c=='-') f=-1;c=getchar();}while(c>47) x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}const int N=1e5+5;
const int inf=1e16;
int n,h[N],tot,in[N],p[N],W[N],vis[N],mi=inf;
queue<int> q;
struct Nahida{int u,v,w,nxt;
}e[N];inline void add(int u,int v,int w){e[++tot]={u,v,w,h[u]};h[u]=tot;in[v]++;
}inline void dfs(int u){vis[u]=1;for(int i=h[u];i;i=e[i].nxt){int v=e[i].v;mi=min(mi,e[i].w);if(vis[v]) continue;dfs(v);}
}signed main(){n=read();int sum=0;for(int i=1;i<=n;i++){int v=read(),w=read();p[i]=v,W[i]=w;sum+=W[i];add(i,v,w);}for(int i=1;i<=n;i++){if(!in[i]){q.push(i);}}int ans=0;while(!q.empty()){int u=q.front();q.pop();int v=p[u];if(in[v]){in[v]--;if(!in[v]){q.push(v);}}}int misum=0;for(int i=1;i<=n;i++){if(in[i]&&!vis[i]){mi=inf;dfs(i);misum+=mi;}}ans=sum-misum;printf("%lld",ans);return 0;
}

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

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

相关文章

Luogu P13925 [POKATT 2024] 联合猫国 / The Paw-litical Game 题解 [ 蓝 ] [ 线性 DP ] [ 种类数观察 ]

联合猫国 去年模拟赛做过一道几乎一模一样的题,于是一眼秒了。 本题的一个结论:最终可合并的区间数为 \(\bm{O(n\log n)}\) 级别。 证明可以考虑构造出可合并区间数最多的序列,显然是所有数都相同时的区间数,可以取…

深入解析:【STM32项目开源】基于STM32的独居老人监护系统

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

CSP-S 41多校 9

10.28 (虽然但是下发文件NOIP?)10.28 CSP-S 前倒数第二场模拟赛,直接一道都没切出来。。。 再不放信心赛真要没信心了。 t1 dp题。 显然对于每一次行动都是一个背包dp。 变种在于背包更换,更换后容量重新计算。 所…

【25.10.28】模拟赛

T1 code #include<bits/stdc++.h> using namespace std; const int N=5e4+5,M=1e3+5; int n,m,ans=0; char s[N],t[M]; int nxt[M]; int f[N][M]; int g[M][30]; void getnxt(){nxt[1]=0;int j=0;for(int i=2;i&…

CSP-S模拟41

CSP-S模拟41 A. 数轴取物(axis) 显然可以有一个 \(O(n^3)\) 的背包 dp,设 \(dp[i][j][k]\) 表示选区间 \([i,j]\),背包容量为 \(k\) 时可获得的最大价值。每次枚举固定左端点从小到大枚举右端点,发现 \(dp[i][j]\) …

Linux双中文编码笔记

Linux双中文编码笔记/etc/locale.gen zh_CN.GB18030 GB18030zh_CN.GBK GBK 上面两行默认是被注释掉的,要打开。 /usr/sbin/dpkg-reconfigure/usr/sbin不在普通用户的PATH里,再说运行它也需要root权限。 如果dkpg-rec…

C++类和对象(1) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

人工智能之编程基础 Python 入门:第二章 Python 的编辑器 VS Code

人工智能之编程基础 Python 入门:第二章 Python 的编辑器 VS Code人工智能之编程基础 Python 入门 第二章 Python 的编辑器 VS Code@目录人工智能之编程基础 Python 入门前言一、VS Code安装二、配置PythonVS Code 汉…

2019 福建省队集训录

退役前最后的贡献\(\scr{Day}\ 1\) T1 (sort)Source:$\bf{solution}$$\bf{code}$T2 (sort)Source:$\bf{solution}$$\bf{code}$T3 (sort)Source:$\bf{solution}$$\bf{code}$

AIX multibos bootlist

Check bash bootlist -m normal -o hdisk0 blv=hd5 pathid=0 lspv hdisk0 00cc4bc0964f315a rootvg active hdisk1 00cc4bc028d6260c altinst_root…

记录一次nginx能通但是请求一直不了的问题

今天在公司碰到这样一个问题:开发后在测试环境进行部署,部署后有个调用其他部门的接口,需要通过nginx来代理请求转发到另一个部门。运维把nginx配置完成后,本地和开发测试都正常,但是通过测试环境访问一直是不同的…

【嵌入式】PWM DAC的滤波器设计

PWM DAC PWM概念本身很简单,具体可以参考各网上资料。PWM:脉冲宽度调制(英语:Pulse-width modulation,缩写:PWM),简称脉宽调制,是用脉冲来输出模拟信号的一种技术,一般变换后脉冲的周期固定,但脉冲的工作周…

被称作遗憾之物 爬满了脊骨 又把控了痛楚 被称作无用之物 修筑了唯一的通路

test30 前两题都 0pts,nbm(? 2-A 飞船制造 (spaceship.cpp) 怎么有傻子没开 c++11 写了 rank 然后 re 惹 /fad 考虑依次枚举 \(s=i+j+k\),计算出 \(s\) 一定的方案数就能确定唯一的 \(s\),方案数计算好像只能考虑…

neovim在windwos11下snack.nvim的问题

问题复现 首先确定有 find 命令,在执行之后,会出现下面的问题: Command failed: - cmd: `find . -type f -not -path */.git/* -not -path */.*`几乎百分百。 查找原因 查阅之后得知,问题为调用了linux风格的find命…

完整教程:Java 集合 “List + Set”面试清单(含超通俗生活案例与深度理解)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

禁用 IPython 历史记录 history.sqlite

Windows 在 %UserProfile%\.ipython\profile_default\ 文件夹中或 Linux 在 ~/.ipython/profile_default/ 目录中(默认配置文件名为profile_default),新建ipython_config.json文件,填入以下内容即可禁用 IPython 历…

Luogu P7914 [CSP-S 2021] 括号序列 题解 [ 蓝 ] [ 区间 DP ] [ 前缀和优化 ] [ 调试技巧 ]

括号序列:无聊,感觉做过类似的拼接类区间 DP 就直接秒了。 注意到这个超级括号序列定义很复杂,除了两边没有 \(\texttt{*}\) 没有啥很好的性质。于是直接考虑暴力区间 DP:定义 \(dp_{l, r}\) 表示 \(l\sim r\) 的合…

扩展BaseMapper类 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

《程序员修炼之道:从小工到专家》前五分之二观后感

读完《程序员修炼之道:从小工到专家》前五分之二的内容,我对“程序员如何成长”有了更清晰的认知。书中开篇便强调“职业主义”,打破了我对“码农”的刻板印象——程序员不应只是被动执行需求的工具人,而应像匠人般…

矩阵快速幂章节笔记(这里主要介绍的是我的错题)

矩阵加速的递推 1.1维k阶 f(n)=f(n-1)+f(n-2)+f(n-i)可以添加系数 那么矩阵的第一列就是系数了,其它用未知数,然后计算。注意start数组,就是开始的数组是倒着来的,请看代码(斐波那契) 2.k维1阶 dp[i][j]=dp[i-…