题目链接

大意

给定\(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的性质:之前放的边值一定都小于当前边值,所以如果要加入这条边,那么之前的边一定都会被打通。

综上:

先把所有边按边权排序,然后在不断合并两个连通块的同时,

动态维护连通块内的最小花费,最大需求与答案值。

出解。

代码

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. const int MAXN=300005;
  5. const long long ONE=1;
  6. int N,M,Fa[MAXN];
  7. int Mx[MAXN],Mi[MAXN];
  8. struct Edge{int x,y,z;}s[MAXN];
  9. bool cmp(Edge A,Edge B){return A.z<B.z;}
  10. int Find(int x){return Fa[x]==x?x:Fa[x]=Find(Fa[x]);}
  11. long long Ans,Dp[MAXN];
  12. int main(){
  13. scanf("%d%d",&N,&M);
  14. for(int i=1,x,y;i<=N;i++){
  15. scanf("%d%d",&x,&y);
  16. Fa[i]=i;Dp[i]=ONE*x*y;
  17. Mi[i]=y;Mx[i]=x;
  18. }
  19. for(int i=1;i<=M;i++)
  20. scanf("%d%d%d",&s[i].x,&s[i].y,&s[i].z);
  21. sort(s+1,s+M+1,cmp);
  22. for(int i=1;i<=M;i++){
  23. int x=Find(s[i].x);
  24. int y=Find(s[i].y);
  25. if(x==y)continue;Fa[x]=y;
  26. Mi[y]=min(Mi[x],Mi[y]);
  27. Mx[y]=max(s[i].z,max(Mx[x],Mx[y]));
  28. Dp[y]=min(Dp[x]+Dp[y],ONE*Mi[y]*Mx[y]);
  29. }
  30. for(int i=1;i<=N;i++)
  31. if(Find(i)==i)Ans+=Dp[i];
  32. printf("%lld\n",Ans);
  33. }

【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. xshell 6 的使用

    1.前言 xshell是用来远程控制云服务器的linux系统的软件,装载window系统里面,可以向发送linux指令, 需要的关键信息:该系统设备的公网ip, 用户名 ,密码 2.软件下载 官网地址 ...

  2. JQuery实现奇偶行不同背景颜色

    假设table的id为:t1 $(document).ready(function(){ $('#t1 > tbody tr:even').css('background','white'); ...

  3. 无聊的周末用Java写个扫雷小游戏

    周末无聊,用Java写了一个扫雷程序,说起来,这个应该是在学校的时候,写会比较好玩,毕竟自己实现一个小游戏,还是比较好玩的.说实话,扫雷程序里面核心的东西,只有点击的时候,去触发更新数据这一步. Sw ...

  4. x86架构应用如何向Arm架构低成本迁移

    曾几何时,无论是在服务器还是个人电脑,CPU芯片领域一直是 Intel 独占鳌头,旗下的 X86_64 架构被广泛采用.然而王权没有永恒,近年来 Arm64 架构异军突起,服务器端有华为鲲鹏920高性 ...

  5. 园子的推广博文:欢迎收看 Apache Flink 技术峰会 FFA 2021 的视频回放

    园子专属收看链接:https://developer.aliyun.com/special/ffa2021/live#?utm_content=g_1000316459 Flink Forward 是 ...

  6. 【PTA】5-1 输入一个正整数n,再输入n个学生的姓名和百分制成绩,将其转换为两级制成绩后输出。

    5-1 输入一个正整数n,再输入n个学生的姓名和百分制成绩,将其转换为两级制成绩后输出.要求定义和调用函数set_grade(stu, n),其功能是根据结构数组stu中存放的学生的百分制成绩scor ...

  7. 【原创】美团二面:聊聊你对 Kafka Consumer 的架构设计

    在上一篇中我们详细聊了关于 Kafka Producer 内部的底层原理设计思想和细节, 本篇我们主要来聊聊 Kafka Consumer 即消费者的内部底层原理设计思想. 1.Consumer之总体 ...

  8. 《剑指offer》面试题62. 圆圈中最后剩下的数字

    问题描述 0,1,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字. 例如,0.1.2.3.4这5个数字组成一个圆圈,从数字0开始每次删除第 ...

  9. [STM32F10x] 从零开始创建一个基于标准库的工程

    硬件:STM32F103C8T6 平台:MDK-AMR V4.70 1.创建一个Keil uVision 的工程 要点:相同类型的源文件放在一起以便于管理       2.添加标准库源文件 3.添加几 ...

  10. deepin20搜狗输入法使用

    放大打字框 打出中文语句符号