【Gym101137K】Knights of the Old Republic(生成树 DP)
大意
给定\(N\)个点\(M\)条边的一张图,其中:
每个点有两个属性\(A_i,B_i\),表示你需要至少\(A_i\)个士兵来攻占该点,而空投一个士兵至该点需要Bi的花费。
每条边都有一个属性\(C_i\),表示如果该边的两个端点的士兵数量之和大于了\(C_i\),那么这条边就被打通了,即士兵可以自由通过该边。
求:攻占过所有点的最小代价。
(\(1\le N \le 3\cdot 10^5\))
思路
首先,最小生成树经典算法Kruskal直接套,把边按值从小到大排序。
考虑一条边所连接的两个连通块如何合并。
设\(Dp[i]\)表示点集\(i\)被攻占完的最下代价,则:
\(Dp[s+t]\)的值为Min(\(Dp[s]+Dp[t]\),打通这条边情况下的最小值)
贪心地想,若这两个连通块总共需要\(K\)个士兵,则这\(K\)个士兵一定是从这两个连通块中有着最小的\(A\)值的点空降的,这样可以满足代价最小。
同时,这样放也可以利用Kruskal的性质:之前放的边值一定都小于当前边值,所以如果要加入这条边,那么之前的边一定都会被打通。
综上:
先把所有边按边权排序,然后在不断合并两个连通块的同时,
动态维护连通块内的最小花费,最大需求与答案值。
出解。
代码
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN=300005;
const long long ONE=1;
int N,M,Fa[MAXN];
int Mx[MAXN],Mi[MAXN];
struct Edge{int x,y,z;}s[MAXN];
bool cmp(Edge A,Edge B){return A.z<B.z;}
int Find(int x){return Fa[x]==x?x:Fa[x]=Find(Fa[x]);}
long long Ans,Dp[MAXN];
int main(){
scanf("%d%d",&N,&M);
for(int i=1,x,y;i<=N;i++){
scanf("%d%d",&x,&y);
Fa[i]=i;Dp[i]=ONE*x*y;
Mi[i]=y;Mx[i]=x;
}
for(int i=1;i<=M;i++)
scanf("%d%d%d",&s[i].x,&s[i].y,&s[i].z);
sort(s+1,s+M+1,cmp);
for(int i=1;i<=M;i++){
int x=Find(s[i].x);
int y=Find(s[i].y);
if(x==y)continue;Fa[x]=y;
Mi[y]=min(Mi[x],Mi[y]);
Mx[y]=max(s[i].z,max(Mx[x],Mx[y]));
Dp[y]=min(Dp[x]+Dp[y],ONE*Mi[y]*Mx[y]);
}
for(int i=1;i<=N;i++)
if(Find(i)==i)Ans+=Dp[i];
printf("%lld\n",Ans);
}
【Gym101137K】Knights of the Old Republic(生成树 DP)的更多相关文章
- 2016 NEERC, Moscow Subregional Contest K. Knights of the Old Republic(Kruskal思想)
2016 NEERC, Moscow Subregional Contest K. Knights of the Old Republic 题意:有一张图,第i个点被占领需要ai个兵,而每个兵传送至该 ...
- @gym - 101137K@ Knights of the Old Republic
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定 N 个点 M 条边的一张图. 每个点有两个属性 Ai, B ...
- 2016-2017 ACM-ICPC, NEERC, Moscow Subregional Contest
A. Altitude 从小到大加入每个数,用set查找前驱和后继即可. 时间复杂度$O(n\log n)$. #include <bits/stdc++.h> using namespa ...
- 3d引擎列表
免费引擎 Agar - 一个高级图形应用程序框架,用于2D和3D游戏. Allegro library - 基于 C/C++ 的游戏引擎,支持图形,声音,输入,游戏时钟,浮点,压缩文件以及GUI. A ...
- 2019 wannafly winter camp day1-4代码库
目录 day1 F div1 爬爬爬山 (最短路) B div2 吃豆豆 (dp) J div2 夺宝奇兵(暴力) J div1 夺宝奇兵 (权值线段树) C div1 拆拆拆数 E div1 流流流 ...
- HDU5697 刷题计划 dp+最小乘积生成树
分析:就是不断递归寻找靠近边界的最优解 学习博客(必须先看这个): 1:http://www.cnblogs.com/autsky-jadek/p/3959446.html 2:http://blog ...
- 【BZOJ5119】【CTT2017】生成树计数 DP 分治FFT 斯特林数
CTT=清华集训 题目大意 有\(n\)个点,点权为\(a_i\),你要连接一条边,使该图变成一颗树. 对于一种连边方案\(T\),设第\(i\)个点的度数为\(d_i\),那么这棵树的价值为: \[ ...
- CCPC-Wannafly Winter Camp Day3 Div1 - 精简改良 - [生成树][状压DP]
题目链接:https://zhixincode.com/contest/14/problem/D?problem_id=206 样例输入 1 5 5 1 2 1 1 3 1 2 4 1 2 5 1 ...
- [BZOJ1494][NOI2007]生成树计数 状压dp 并查集
1494: [NOI2007]生成树计数 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 793 Solved: 451[Submit][Status][ ...
随机推荐
- centos8 yum安装nginx后启动不了nginx
起动报下列错误 移动到安装目录下起动报下列错误,说是端口被占用 输入journalctl -xe命令查看,发现如下: 这个是一个什么错误,度娘一下SElinux 输入sestatus查看下SElinu ...
- linux 【阿里云服务器】 配置 redis 的正确流程
1.前言 我的域名备案前几天通过了,这篇随笔完整的记录 redis 的安装流程 与各种 问题 的 具体解决方案. 2.操作[跟着步骤来] (1)指令cd /usr/local 进入local文件夹里面 ...
- 实验 5 :OpenFlow 协议分析和 OpenDaylight 安装
实验 5 :OpenFlow 协议分析和 OpenDaylight 安装 一.实验目的 回顾 JDK 安装配置,了解 OpenDaylight 控制的安装,以及 Mininet 如何连接: 通过抓包获 ...
- Word2010制作收款单
原文链接:https://www.toutiao.com/i6488255406136099342/ 页面设置 选择"页面布局"选项卡,"页面设置"功能组,&q ...
- 微信小程序配置域名的时候提示“校验文件验证失败”
在微信小程序后台配置web-view的业务域名跟扫普通链接二维码打开小程序两项功能时, 一直提示"校验文件验证失败,请下载校验文件,上传到服务器指定的目录" 实际访问校验文件的路径 ...
- SYCOJ570传纸条
题目-传纸条 (shiyancang.cn) 算法(线性DP) O(n3)O(n3)首先考虑路径有交集该如何处理.可以发现交集中的格子一定在每条路径的相同步数处.因此可以让两个人同时从起点出发,每次同 ...
- eclipse中配置Webdriver
安装JDK,配置好Java环境 下载Eclipse,并完成安装 下载Webdriver的JAR文件(访问Selenium官网,下载Java版的zip文件,并且解压到本地磁盘,解压后文件夹内容如下图:) ...
- 有道翻译js加密参数分析
平时在渗透测试过程中,遇到传输的数据被js加密的比较多,这里我以有道翻译为例,来分析一下它的加密参数 前言 这是有道翻译的界面,我们随便输入一个,抓包分析 我们发现返回了一段json的字符串,内容就是 ...
- 曼孚科技:“四管齐下”筑牢AI数据隐私安全防线
谈及数据,绕不开的一个话题就是数据隐私与数据安全.随着数字化进程加快,数据安全事件频发,据Risk Based Security统计,去年国际数据泄露事件近5000起,被泄露数据近41亿条,数据造成的 ...
- CTF-sql-order by盲注
本文章只讨论了order by盲注,关于order by的报错等注入不在本文章讨论范围,另有文章. 让我们先来看看本文章所使用的表的内容,如下图: 接下来先了解一下order by的基础知识: ord ...