题目链接

大意

给定\(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)的更多相关文章

  1. 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个兵,而每个兵传送至该 ...

  2. @gym - 101137K@ Knights of the Old Republic

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定 N 个点 M 条边的一张图. 每个点有两个属性 Ai, B ...

  3. 2016-2017 ACM-ICPC, NEERC, Moscow Subregional Contest

    A. Altitude 从小到大加入每个数,用set查找前驱和后继即可. 时间复杂度$O(n\log n)$. #include <bits/stdc++.h> using namespa ...

  4. 3d引擎列表

    免费引擎 Agar - 一个高级图形应用程序框架,用于2D和3D游戏. Allegro library - 基于 C/C++ 的游戏引擎,支持图形,声音,输入,游戏时钟,浮点,压缩文件以及GUI. A ...

  5. 2019 wannafly winter camp day1-4代码库

    目录 day1 F div1 爬爬爬山 (最短路) B div2 吃豆豆 (dp) J div2 夺宝奇兵(暴力) J div1 夺宝奇兵 (权值线段树) C div1 拆拆拆数 E div1 流流流 ...

  6. HDU5697 刷题计划 dp+最小乘积生成树

    分析:就是不断递归寻找靠近边界的最优解 学习博客(必须先看这个): 1:http://www.cnblogs.com/autsky-jadek/p/3959446.html 2:http://blog ...

  7. 【BZOJ5119】【CTT2017】生成树计数 DP 分治FFT 斯特林数

    CTT=清华集训 题目大意 有\(n\)个点,点权为\(a_i\),你要连接一条边,使该图变成一颗树. 对于一种连边方案\(T\),设第\(i\)个点的度数为\(d_i\),那么这棵树的价值为: \[ ...

  8. 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 ...

  9. [BZOJ1494][NOI2007]生成树计数 状压dp 并查集

    1494: [NOI2007]生成树计数 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 793  Solved: 451[Submit][Status][ ...

随机推荐

  1. SpringBoot 之 国际化

    增加国际化i18n语言配置: # src/main/resources/i18n/login.properties login.btn=登录 # src/main/resources/i18n/log ...

  2. centos6.5-svn搭建文档

    下载相关软件 wget http://subversion.tigris.org/downloads/subversion-1.6.6.tar.gz wget http://subversion.ti ...

  3. CF149D游戏

    题目描述 Petya遇到了一个关于括号序列的问题: 给定一个字符串S,它代表着正确的括号序列,即("(")与 (")")是匹配的.例如:"(())() ...

  4. Pandas系列(十八)- 多级索引

    多级索引 多级索引(也称层次化索引)是pandas的重要功能,可以在Series.DataFrame对象上拥有2个以及2个以上的索引.实质上,单级索引对应Index对象,多级索引对应MultiInde ...

  5. 2022年form表单中input控件最详细总结

    语法 <input type="" name="" id="" value="" placeholder=&quo ...

  6. Java中:接口,抽象类,内部类

    Java8中的接口 public interface Output { //接口里定义的成员变量只能是常量 //默认使用public static final修饰 int MAX_CACHE_LINE ...

  7. day3 创建数组并完成对数组的操作

    1.实现函数action()初始化数据全0的操作 2.实现函数assignment()利用指针给数组赋值0~9 3.实现函数print()打印数组的每个函数 4.实现函数reverse()完成对数组的 ...

  8. vue 快速入门 系列 —— Vue(自身) 项目结构

    其他章节请看: vue 快速入门 系列 Vue(自身) 项目结构 前面我们已经陆续研究了 vue 的核心原理:数据侦测.模板和虚拟 DOM,都是偏底层的.本篇将和大家一起来看一下 vue 自身这个项目 ...

  9. codeblocks中报错:'to_string' was not declared in this scope解决方案

    在windows下使用codeblocks(编译器采用MinGW)时,有时会遇到"'to_string' was not declared in this scope"的错误,这里 ...

  10. [源码分析] Facebook如何训练超大模型 --- (2)

    [源码分析] Facebook如何训练超大模型 --- (2) 目录 [源码分析] Facebook如何训练超大模型 --- (2) 0x00 摘要 0x01 回顾 1.1 ZeRO 1.1.1 Ze ...