qwq自闭的一个题

我来修锅辣!!!!!!

这篇题解!可以\(hack\)全网大部分的做法!!!

首先,我们可以把原图中的边,分成两类,一类是与\(1\)相连,另一类是不与\(1\)相连。

原题就转化成选择\(k\)条关键边的\(MST\)

那么我们可以按照tree I 那个题的思路来考虑这个题。

由于是\(MST\),所以函数满足下凸,那么对于这种恰好选\(k\)个的问题,我们可以直接凸优化。

\(erf\)一个值,然后把所有与1相连的边都加上这个值。

对于相等权值的来说,我们优先把不与1相连的边排在前面。

那么这种情况我们二分出来的那个\(mid\)
满足两个条件
1.满足下界,也就是说,能选到<=k条边的最大的\(mid\)
2.在这种情况下,\(mst\)上面的与1相连的边,是“必须出现在MST”上的边。

那么我们考虑该怎么统计方案。

首先,对于那些一定要出现在\(MST\)上的关键边,我们先把他们加入\(ans\)(只加入与1相连的边),然后对于剩下的边,把与1相连的边加上\(mid\)后,进行\(MST\),如果已经选够了\(k\)条边,那么对于剩下的关键边就直接跳过。

这样做正确的原因是,我们首先把必须要出现暗在\(MST\)上的边加入了\(ans\),然后对于剩下的边,只会分成两种,可能在MST上,或者是不可能在MST上,那剩下的部分直接用贪心的思路来做\(MST\)就是没错的。

而网上大多数题解是错的,qwq
所以这个问题困扰了我很久

#include<bits/stdc++.h>
#define pb push_back
#define mk make_pair
#define ll long long
#define int long long
using namespace std;inline int read()
{int x=0,f=1;char ch=getchar();while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}while (isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;
}
const int maxn = 3e5+1e2;
struct Edge{int u,v;ll w;int tag,num;
};
Edge e[maxn];
int fa[maxn];
int n,m,k;
int val;
int find(int x)
{if (fa[x]!=x) fa[x]=find(fa[x]);return fa[x];
}bool cmp(Edge a,Edge b)
{if(a.w==b.w) return a.tag>b.tag;return a.w<b.w;
}bool cmp1(Edge a,Edge b)
{if (a.w==b.w) return a.tag<b.tag;return a.w<b.w;
}int solve()
{for (int i=1;i<=n;i++) fa[i]=i;sort(e+1,e+1+m,cmp1);int tot=0;for (int i=1;i<=m;i++){int f1 = find(e[i].u);int f2 = find(e[i].v);if (f1==f2) continue;fa[f1]=fa[f2];tot+=e[i].tag; }return tot;
}vector<int> v;int lyf[maxn*2];signed main()
{n=read(),m=read(),k=read();ll l = -1e10,r=1e10;int ymh=0;for (int i=1;i<=m;i++){e[i].u=read(),e[i].v=read(),e[i].w=read(),e[i].num=i;if (e[i].u==1 || e[i].v==1) e[i].tag=1;if (e[i].tag==1) ymh++;}ll ans=0;//cout<<ymh<<endl;while(r>=l){ll mid = (l+r)/2;for (int i=1;i<=m;i++) if(e[i].tag) e[i].w+=mid;int tmp = solve();//cerr<<"*"<<mid<<" "<<tmp<<endl;if (tmp<=k) r=mid-1,ans=mid;else l=mid+1;for (int i=1;i<=m;i++) if (e[i].tag) e[i].w-=mid;}//cerr<<ans<<endl;int ptx=0;for (int i=1;i<=m;i++) if (e[i].tag) e[i].w+=ans;for (int i=1;i<=n;i++) fa[i]=i;sort(e+1,e+1+m,cmp1);for (int i=1;i<=m;i++){int f1 = find(e[i].u);int f2 = find(e[i].v);if (f1==f2) continue;fa[f1]=fa[f2];if (e[i].tag==1) lyf[e[i].num]=1;}for (int i=1;i<=n;i++) fa[i]=i;for (int i=1;i<=m;i++){if (lyf[e[i].num]){int f1 = find(e[i].u);int f2 = find(e[i].v);if (f1==f2) continue;fa[f1]=fa[f2];ptx+=e[i].tag;v.pb(e[i].num);}}//cout<<ptx<<endl;if (ptx>k) {cout<<-1;return 0;}//for (int i=1;i<=n;i++) fa[i]=i;//cerr<<ptx<<endl;sort(e+1,e+1+m,cmp);for (int i=1;i<=m;i++){int f1 = find(e[i].u);int f2 = find(e[i].v);if (f1==f2) continue;if (ptx==k && e[i].tag==1) continue;fa[f1]=fa[f2];v.pb(e[i].num);if (e[i].tag==1) ptx++;}//cerr<<ptx<<endl;if(ptx!=k || v.size()!=n-1) {cout<<-1;return 0;}cout<<n-1<<endl;for (int i=0;i<v.size();i++) cout<<v[i]<<" ";return 0;
}
//final

转载于:https://www.cnblogs.com/yimmortal/p/10204210.html

CF125E MST company (凸优化+MST)相关推荐

  1. 洛谷2619/bzoj2654 Tree(凸优化+MST)

    bzoj的数据是真的水.. qwq 由于本人还有很多东西不是很理解 qwq 所以这里只写一个正确的做法. 首先,我们会发现,对于你选择白色边的数目,随着数目的上涨,斜率是单调升高的. 那么这时候我们就 ...

  2. 【BZOJ5311/CF321E】贞鱼/Ciel and Gondolas(动态规划,凸优化,决策单调性)

    [BZOJ5311/CF321E]贞鱼/Ciel and Gondolas(动态规划,凸优化,决策单调性) 题面 BZOJ CF 洛谷 辣鸡BZOJ卡常数!!!!!! 辣鸡BZOJ卡常数!!!!!! ...

  3. 详解GCN、GAT、凸优化、贝叶斯、MCMC、LDA

    如果你准备发AI方向的论文,或准备从事科研工作或已在企业中担任AI算法岗的工作.那么我真诚的向大家推荐,贪心学院<高阶机器学习研修班>,目前全网上应该找不到类似体系化的课程.课程精选了四大 ...

  4. 机器学习数学基础系列|凸优化——开启新世界的大门(上)

    在机器学习中,要做的核心工作之一就是根据实际问题,定义出一个目标函数,接着找到这个目标函数的最优解.在找这个最优解的过程中,你可能会生不如死~ 但是,上帝关上了你的门,总会给你打开一扇窗~ 有一类问题 ...

  5. 机器学习+优化问题的种类、如何优化、凸优化、非凸优化、对偶问题、KKT条件

    机器学习+优化问题的种类.如何优化.凸优化.非凸优化.对偶问题.KKT条件 目录

  6. 干货丨从基础知识到实际应用,一文了解「机器学习非凸优化技术」

    文章来源:机器之心 优化作为一种研究领域在科技中有很多应用.随着数字计算机的发展和算力的大幅增长,优化对生活的影响也越来越大.今天,小到航班表大到医疗.物理.人工智能的发展,都依赖优化技术的进步. 在 ...

  7. dp凸优化/wqs二分学习笔记(洛谷4383 [八省联考2018]林克卡特树lct)

    qwq 安利一个凸优化讲的比较好的博客 https://www.cnblogs.com/Gloid/p/9433783.html 但是他的暴力部分略微有点问题 qwq 我还是详细的讲一下这个题+这个知 ...

  8. 凸优化 [Convex Optimization] — [美] 鲍德(Stephen Boyd),Lieven Vandenberghe 著,王书宁,许鋆,黄晓霖 译

    <信息技术和电气工程学科国际知名教材中译本系列:凸优化>从理论.应用和算法三个方面系统地介绍凸优化内容. 凸优化在数学规划领域具有非常重要的地位.从应用角度看,现有算法和常规计算能力已足以 ...

  9. UA MATH567 高维统计专题3 含L1-norm的凸优化6 Stochastic Gradient Descent简介

    UA MATH567 高维统计专题3 含L1-norm的凸优化6 Stochastic Gradient Descent简介 Stochastic Gradient Descent的思想 Varian ...

最新文章

  1. 基于成像激光雷达的鲁棒位置识别
  2. python做后端速度慢吗_【后端开发】python为什么慢?
  3. Linux如何指向mysql_linux的基本操作(mysql 的基本操作)
  4. 【BZOJ3894】文理分科
  5. deeplab运行指南
  6. CSS3总结(干货)
  7. 南京林业大学转计算机专业好转吗,南京林业大学如何转专业
  8. ASCII,Unicode和UTF-8
  9. 定制家具设计拆单用什么软件好?
  10. 瑞友天翼 mysql 密码_瑞友天翼忘记密码的处理方法.doc
  11. c语言大作业:员工工资管理系统
  12. AngularJs中input uib-typeahead 搜索加自动补全 注意点
  13. MeshLab怎么换背景颜色?
  14. css 标点符号换行问题
  15. ThreadPoolExecutor中的submit()方法详细讲解
  16. 学生信息管理系统——错误集锦(五)
  17. 计算机的硬盘类型及特点是,电脑硬盘中的蓝盘、黑盘、红盘、绿盘有什么区别?特点?...
  18. 星聚宝—云服务器快速搭建网站(阿里云服务器举例)
  19. BUUCTF misc 专题(25)神秘龙卷风
  20. The best of youth --灿烂人生,眼前所见皆美好!

热门文章

  1. 【opencv学习】Fast算法进行角点检测
  2. 【opencv】【第一玩】坤坤的篮球
  3. mysql查询全年星期_数据库查询显示一年中所有的周一到周五的数据
  4. ios开发循环网络请求_如何简化网络请求接口开发
  5. 解决方法:AttributeError: module ‘torchtext.data‘ has no attribute ‘Field‘
  6. 面试题11. 旋转数组的最小数字
  7. 改善深层神经网络:超参数调整、正则化以及优化——2.9学习率衰减
  8. 在Windows下使用CMake+MinGW搭建C/C++编译环境
  9. 数据写入mysql的方式,FMDB写入大量数据的处理方法
  10. 1584 - Circular Sequence