P3639-[APIO2013]道路费用【最小生成树】

正题

题目链接:https://www.luogu.com.cn/problem/P3639


题目大意

给出nnn个点mmm条有边权的无向图,然后再给出kkk条边权未定义的边,然后每个点有一个人数pip_ipi

现在要你给未确定的边权的边确定边权然后选出图的一棵最小生成树,之后所有点上的人都从自己的点走到根节点,当一个人经过刚刚确定边权的边时会支付这条边的权值的费用,现在要求总费用和最大。

保证mmm条边的图联通且权值互不相同。

1≤n≤105,1≤m≤3×105,1≤k≤201\leq n\leq 10^5,1\leq m\leq 3\times 10^5,1\leq k\leq 201n105,1m3×105,1k20


解题思路

突破口肯定在于权值互不相同,因为这样的话最小生成树就唯一了,然后发现我们加上kkk条边后最多替换掉原来图上的kkk条边,所以大部分的边都是和原来的相同的。

我们可以先把这kkk条边连接上,然后跑一棵最小生成树,再吧这kkk条边去掉这样就最多会产生k+1k+1k+1个连通块。

然后再用联通块跑一次最小生成树,把这些边记下来,这些边是可能使用上的。

之后我们2k2^k2k枚举哪些边选不选入最小生成树上,然后拿上面的边跑最小生成树,之后每条边的权值就是所有连接分割的两个联通块的最小边权,这个我们可以枚举边然后直接暴力跳,之后统计答案就好了。

时间复杂度:O(mlog⁡m+2kk2)O(m\log m+2^kk^2)O(mlogm+2kk2)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define ll long long
using namespace std;
const ll N=3e5+10,K=22;
struct edge{ll x,y,w;
}e[N];
ll n,m,k,cnt,answer,p[N],fa[N],fb[N],rev[N];
ll r[K],w[K],dep[K],f[K],dx[K],dy[K],mn[K];
vector<int>G[K];ll a[K][K];
bool cmp(edge x,edge y)
{return x.w<y.w;}
ll find(ll x)
{return (fa[x]==x)?x:(fa[x]=find(fa[x]));}
ll finb(ll x)
{return (fb[x]==x)?x:(fb[x]=finb(fb[x]));}
void dfs(ll x,ll fa){r[x]=w[x];f[x]=fa;dep[x]=dep[fa]+1;for(ll i=0;i<G[x].size();i++){ll y=G[x][i];if(y==fa)continue;dfs(y,x);r[x]+=r[y];}return;
}
signed main()
{scanf("%lld%lld%lld",&n,&m,&k);for(ll i=1;i<=m;i++){ll x,y,w;scanf("%lld%lld%lld",&x,&y,&w);e[i]=(edge){x,y,w};}sort(e+1,e+1+m,cmp);for(ll i=1;i<=n;i++)fa[i]=fb[i]=i;for(ll i=0;i<k;i++){scanf("%lld%lld",&dx[i],&dy[i]);ll x=find(dx[i]),y=find(dy[i]);if(x==y)continue;fa[x]=y;}for(ll i=1;i<=n;i++)scanf("%lld",&p[i]);for(ll i=1;i<=m;i++){ll x=e[i].x,y=e[i].y;x=find(x);y=find(y);if(x==y)continue;fa[x]=y;fb[finb(e[i].x)]=finb(e[i].y);}for(ll i=1;i<=n;i++)if(finb(i)==i)rev[i]=++cnt,fa[cnt]=cnt;for(ll i=1;i<=n;i++)rev[i]=rev[finb(i)];for(ll i=1;i<=n;i++)w[rev[i]]+=p[i];memset(a,0x3f,sizeof(a));int pm=m;m=0;for(ll i=1;i<=pm;i++){ll x=e[i].x,y=e[i].y,w=e[i].w;x=rev[x];y=rev[y];if(find(x)==find(y))continue;fa[find(x)]=find(y);e[++m]=(edge){x,y,w};}sort(e+1,e+1+m,cmp);ll MS=(1<<k);for(ll i=0;i<k;i++)dx[i]=rev[dx[i]],dy[i]=rev[dy[i]];for(ll s=0;s<MS;s++){memset(mn,0x3f,sizeof(mn));for(ll i=1;i<=cnt;i++)fa[i]=i,G[i].clear();bool flag=0;for(ll i=0;i<k;i++){if(!((s>>i)&1))continue;ll x=find(dx[i]),y=find(dy[i]);if(x==y){flag=1;break;}fa[x]=y;G[dx[i]].push_back(dy[i]);G[dy[i]].push_back(dx[i]);}if(flag)continue;for(ll i=1;i<=m;i++){ll x=find(e[i].x),y=find(e[i].y);if(x==y)continue;fa[x]=y;G[e[i].x].push_back(e[i].y);G[e[i].y].push_back(e[i].x);}dfs(rev[1],0);for(ll i=1;i<=m;i++){ll x=e[i].x,y=e[i].y;while(x!=y){if(dep[x]<dep[y])swap(x,y);mn[x]=min(mn[x],e[i].w);x=f[x];}}ll ans=0;for(ll i=0;i<k;i++){if(!((s>>i)&1))continue;ll x=dx[i],y=dy[i];if(dep[x]<dep[y])swap(x,y);ans+=mn[x]*r[x];}answer=max(answer,ans);}printf("%lld\n",answer);return 0;
}

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

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

相关文章

你准备好了在云中工作吗?

前几天写了一篇文章 《云时代的.NET》&#xff0c;今天继续这个话题聊下云时代的技能。无服务器计算&#xff0c;容器化&#xff0c;云原生应用&#xff0c;DevOps&#xff0c;人工智能&#xff0c;机器学习以及混合云和多云解决方案等IT趋势正在成为主流或“新常态”。所有大小…

珂朵莉树(ODT)

珂朵莉树 ODT 主要内容 珂朵莉树是基于数据随机且有整体赋值操作而对序列操作的乱搞算法。 它的主要思想是用 set 维护若干个数值上相同的区间&#xff0c;并暴力处理其他询问。 建立 在 set 中&#xff0c;我们需要用结构体记录每个区间的信息&#xff1a; struct NODE {int l…

最长公共上升子序列(LCIS)

题意&#xff1a; 求最长公共上升子序列 题解&#xff1a; 最长公共上升子序列 最长公共子序列&#xff08;LCS&#xff09;与最长上升子序列&#xff08;LIS&#xff09; LCS核心代码&#xff1a; for(int i1;i<n;i){for(int j1;j<m;j){if(a[i]b[j])dp[i][j]max(dp[…

YBTOJ洛谷P1407:稳定婚姻(强连通分量)

文章目录题目描述解析代码题目描述 我们已知n对夫妻的婚姻状况&#xff0c;称第 i 对夫妻的男方为 Bi &#xff0c;女方为 Gi。 若某男 Bi 与某女 Gi 曾经交往过( i!j )&#xff0c;则当某方与其配偶&#xff08;即 Bi 与 Gi 或 Bj 与 Gj&#xff09;感情出现问题时&#xff…

[高斯消元及理论]线性方程组整数/浮点数,模线性方程组,异或方程组模板

文章目录理论线性方程组整数类型解线性方程组浮点类型解模线性方程组异或方程组高斯约旦消元约旦消元无解无穷解唯一解理论 高斯消元法&#xff0c;是线性代数规划中的一个算法&#xff0c;可用来为线性方程组求解。但其算法十分复杂&#xff0c;不常用于加减消元法&#xff0c…

eShopOnContainers 知多少[7]:Basket microservice

引言Basket microservice&#xff08;购物车微服务&#xff09;主要用于处理购物车的业务逻辑&#xff0c;包括&#xff1a;购物车商品的CRUD订阅商品价格更新事件&#xff0c;进行购物车商品同步处理购物车结算事件发布订阅订单成功创建事件&#xff0c;进行购物车的清空操作架…

P6805-[CEOI2020]春季大扫除【贪心,树链剖分,线段树】

正题 题目链接:https://www.luogu.com.cn/problem/P6805 题目大意 给出nnn个点的一棵树&#xff0c;qqq次独立的询问。每次询问会在一些节点上新增一些子节点&#xff0c;然后你每次可以选择两个为选择过的叶子节点然后覆盖它们的路径&#xff0c;要求在覆盖所有边的情况下使…

后缀数组 SA

后缀数组 SA 后缀树组(SA&#xff0c;suffix array)&#xff0c;用于处理字符串子串形成的结构。 处理子串的结构主要方式有&#xff1a;后缀数组 SA&#xff0c;后缀自动机 SAM&#xff0c;后缀树 ST。 后缀树和后缀自动机暂时决定咕咕咕&#xff0c;以后学习可以参考ix35 的字…

导弹防御系统

导弹防御系统 题意&#xff1a; 最少可以找到一直 严格单调 上升或者一直 严格单调 下降 题解&#xff1a; 第一反应是LIS&#xff0c;但是本题要求找一直上升或者一直下降的&#xff0c;LIS不能实现 但是我们还是从LIS下手&#xff0c;LIS中最核心的思想是能否将一个元素加…

STL:bitset用法详解

文章目录前言声明输入输出访问与修改位运算所谓bitset&#xff0c;就是bit组成的set &#xff08;逃&#xff09; 前言 bitset的诸多好处&#xff1a; 1.节约空间 2.增加一些新的功能 3.几乎没有副作用 4.有了123还不够吗&#xff01;&#xff1f; 当然&#xff0c;还有一个决…

微软热门开源项目及代码库地址

点击蓝字关注我这几年来&#xff0c;微软在开源与社区方向的努力与成就是全世界有目共睹的。微软的开源项目超过2000多个&#xff0c;挑了一些比较火热的给大家整理了一下。欢迎补充~Visual Studio Code非常流行的跨平台代码编辑器&#xff0c;提供全面的编辑和调试支持、可扩展…

P6846-[CEOI2019]Amusement Park【状压dp,FWT】

正题 题目链接:https://www.luogu.com.cn/problem/P6846 题目大意 给出nnn个点mmm条边的一张有向图&#xff0c;保证两个点之间最多只有一条边。现在你可以取反一些边使得图变为一张DAGDAGDAG&#xff0c;求所有方案的取反的边数和。 1≤n≤181\leq n\leq 181≤n≤18 解题思路…

CDQ 分治与整体二分

CDQ 分治与整体二分 CDQ 分治 主要是一种分治思想&#xff0c;常用于解决偏序问题。 例如三维偏序问题&#xff0c;我们采用的方法是先处理以第一关键字为区分的左区间、右区间内的答案&#xff0c;再处理左右区间互不干涉的答案。 四维偏序呢&#xff1f; 咕咕咕 整体二分 主要…

[树链剖分][SDOI 2011]染色,Housewife Wind

文章目录T1&#xff1a;Housewife Wind题目题解codeT2&#xff1a;染色题目题解code今天选择写这篇博客主要是为了告诉大家一个道理&#xff0c;数组比vectorvectorvector快太多了&#xff0c;我这两道题第一次都因为vectorvectorvector&#xff0c;TTT到飞起 T1&#xff1a;…

最长上升子序列模型

有两个模板&#xff1a; 最长上升子序列这类题目都是这俩变形而来 最长上升子序列模型 AcWing 1017. 怪盗基德的滑翔翼1120人打卡 AcWing 1014. 登山1094人打卡 AcWing 482. 合唱队形1069人打卡 AcWing 1012. 友好城市1040人打卡 AcWing 1016. 最大上升子序列和1048人打卡 AcWi…

YBTOJ:向量问题(线段树分治、凸包)

文章目录题目描述数据范围解析代码题目描述 你要维护一个向量集合&#xff0c;支持以下操作&#xff1a; 插入一个向量 。 删除插入的第 x 个向量。 查询当前集合与(x,y)(x,y)(x,y) 点积的最大值是多少。如果当前是空集输出0。 数据范围 n<2e5,x、y∈[1,2e6]n<2e5,x、y∈…

ASP.NET Core 网站运行时修改设置如何自动生效

点击蓝字关注我在ASP.NET Core中&#xff0c;如果修改了appsettings.json中的设置&#xff0c;那么默认情况下就得重启网站才能生效。有没有办法在修改设置后自动刷新并应用呢&#xff1f;背景首先&#xff0c;我们看看默认模板建出来的 ASP.NET Core 网站&#xff0c;配置文件…

AGC004(A~E)

前言 FFF不会做&#xff0c;正解好神仙&#xff0c;爬了 正题 AT2041 [AGC004A] Divide a Cuboid https://www.luogu.com.cn/problem/AT2041 题目大意 一个A∗B∗CA*B*CA∗B∗C的立方体&#xff0c;分成两个长方体使得边长都是整数而且体积差最小。 1≤A,B,C≤1091\leq A,B…

1022. 宠物小精灵之收服

1022. 宠物小精灵之收服 题意&#xff1a; 现在有n个胶囊&#xff0c;m个生命值&#xff0c;k个怪物&#xff0c;每个怪物需要a[i]个胶囊&#xff0c;且会造成b[i]个伤害后才能捕获&#xff0c;问在活着的前提下&#xff0c;最多捕获多少怪物&#xff0c;在怪物最多的情况下剩…

平衡树 - FHQ 学习笔记

平衡树 - FHQ 学习笔记 主要参考万万没想到 的 FHQ-Treap学习笔记。 本片文章的姊妹篇&#xff1a;平衡树 - Splay 学习笔记。 感觉完全不会平衡树&#xff0c;又重新学习了一遍 FHQ&#xff0c;一口气把常见套路都学完了。 一、大致内容及分类 FHQ(???)&#xff0c;全称非旋…