【CF125E】MST Company(凸优化,最小生成树)

题面

洛谷

CF

题解

第一眼看见就给人丽洁姐那道\(tree\)一样的感觉。

那么二分一个权值,加给所有有一个端点是\(1\)的边,

然后跑最小生成树\(check\)一下就好了。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<vector>
  8. using namespace std;
  9. #define ll long long
  10. #define MAX 5050
  11. #define MAXL 100100
  12. inline int read()
  13. {
  14. int x=0;bool t=false;char ch=getchar();
  15. while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
  16. if(ch=='-')t=true,ch=getchar();
  17. while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
  18. return t?-x:x;
  19. }
  20. struct edge{int u,v,w,id;}e[MAXL];
  21. bool operator<(edge a,edge b)
  22. {
  23. if(a.w!=b.w)return a.w<b.w;
  24. return a.u>b.u;
  25. }
  26. int f[MAX],n,m,K,tot;
  27. int getf(int x){return x==f[x]?x:f[x]=getf(f[x]);}
  28. vector<int> g;
  29. int Kruskal(int mid)
  30. {
  31. for(int i=1;i<=m;++i)if(e[i].u==1)e[i].w+=mid;
  32. for(int i=1;i<=n;++i)f[i]=i;
  33. int cnt=0;g.clear();sort(&e[1],&e[m+1]);
  34. for(int i=1;i<=m;++i)
  35. {
  36. int u=getf(e[i].u),v=getf(e[i].v);
  37. if(u==v)continue;
  38. f[u]=v;g.push_back(e[i].id);
  39. if(e[i].u==1)++cnt;
  40. }
  41. for(int i=1;i<=m;++i)if(e[i].u==1)e[i].w-=mid;
  42. return cnt;
  43. }
  44. void Calc(int mid)
  45. {
  46. for(int i=1;i<=m;++i)if(e[i].u==1)e[i].w+=mid;
  47. for(int i=1;i<=n;++i)f[i]=i;
  48. int cnt=0,tot=0;g.clear();sort(&e[1],&e[m+1]);
  49. for(int i=1;i<=m;++i)
  50. {
  51. int u=getf(e[i].u),v=getf(e[i].v);
  52. if(u==v)continue;
  53. if(e[i].u==1&&cnt==K)continue;
  54. f[u]=v;g.push_back(e[i].id);
  55. if(e[i].u==1)++cnt;++tot;
  56. }
  57. if(cnt<K||tot!=n-1){puts("-1");exit(0);}
  58. }
  59. int main()
  60. {
  61. n=read();m=read();K=read();
  62. for(int i=1;i<=m;++i)
  63. {
  64. int u=read(),v=read(),w=read();
  65. if(u>v)swap(u,v);if(u==1)++tot;
  66. e[i]=(edge){u,v,w,i};
  67. }
  68. int l=-100000,r=100000,ret=-1e9;
  69. while(l<=r)
  70. {
  71. int mid=(l+r)>>1;
  72. int d=Kruskal(mid);
  73. if(d<K)r=mid-1;
  74. else l=mid+1,ret=mid;
  75. }
  76. if(ret<-1e5){puts("-1");return 0;}
  77. Calc(r);printf("%d\n",n-1);
  78. for(int i=0;i<n-1;++i)printf("%d ",g[i]);
  79. return 0;
  80. }

【CF125E】MST Company(凸优化,最小生成树)的更多相关文章

  1. luogu CF125E MST Company wqs二分 构造

    LINK:CF125E MST Company 难点在于构造 前面说到了求最小值 可以二分出斜率k然后进行\(Kruskal\) 然后可以得到最小值.\(mx\)为值域. 得到最小值之后还有一个构造问 ...

  2. CF125E MST company (凸优化+MST)

    qwq自闭的一个题 我来修锅辣!!!!!! 这篇题解!可以\(hack\)全网大部分的做法!!! 首先,我们可以把原图中的边,分成两类,一类是与\(1\)相连,另一类是不与\(1\)相连. 原题就转化 ...

  3. CF-125E MST Company (单度限制最小生成树)

    参考红宝书 题目链接 对除 1 号点顶点外的点集,求一次最小生成森林,对于最小生成森林的联通分量,选择最短的一条边与 1 号点相连.设此时 1 号点的度为 \(k_0\),如果 \(k_0\lt L\ ...

  4. [CF125E]MST Company

    codeforces description 给出一张\(n\)点\(m\)条边的无向图,求一棵满足\(1\)号点度数恰好为\(k\)的最小生成树,并输出方案. \(1\le k\le n\le500 ...

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

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

  6. 【BZOJ2654】Tree(凸优化,最小生成树)

    [BZOJ2654]Tree(凸优化,最小生成树) 题面 BZOJ 洛谷 题解 这道题目是之前\(Apio\)的时候写的,忽然发现自己忘记发博客了... 这个万一就是一个凸优化, 给所有白边二分一个额 ...

  7. CodeForces 125E MST Company

    E. MST Company time limit per test 8 seconds memory limit per test 256 megabytes input standard inpu ...

  8. 机器学习&数据挖掘笔记_15(关于凸优化的一些简单概念)

    没有系统学过数学优化,但是机器学习中又常用到这些工具和技巧,机器学习中最常见的优化当属凸优化了,这些可以参考Ng的教学资料:http://cs229.stanford.edu/section/cs22 ...

  9. paper 110:凸优化和非凸优化

    数学中最优化问题的一般表述是求取,使,其中是n维向量,是的可行域,是上的实值函数.凸优化问题是指是闭合的凸集且是上的凸函数的最优化问题,这两个条件任一不满足则该问题即为非凸的最优化问题. 其中,是 凸 ...

随机推荐

  1. kali虚拟机安装后操作[配置ssh,安装vmtools,更新源]

    更新源 # 打开控制台, 输入以下命令打开编辑器修改配置文件 $ leafpad /etc/apt/sources.list #kali官方源 deb http://http.kali.org/kal ...

  2. 图形 - bootStrap4常用CSS笔记

    .rounded 图片显示圆角效果 .rounded-circle 设置椭圆形图片 .img-thumbnail 设置图片缩略图(图片有边框) .img-fluid 响应式图片 .float-righ ...

  3. WebStorm微信小程序单位rpx出现空格问题

    Windows先下载sed 配置Tools->File Watchers->+ 添加下图配置 //windows系统 -i s/"\ rpx"/rpx/g $FileP ...

  4. MAVEN项目导入src/test/java项目报错

    转载博客:https://blog.csdn.net/gengjianchun/article/details/78679036    https://blog.csdn.net/jsloveyou/ ...

  5. Python 3 利用机器学习模型 进行手写体数字检测

    0.引言 介绍了如何生成手写体数字的数据,提取特征,借助 sklearn 机器学习模型建模,进行识别手写体数字 1-9 模型的建立和测试. 用到的几种模型: 1. LR,Logistic Regres ...

  6. golang -- 字符串就地取反

    字符串 定义 在golang中字符串是一种不可变的字节序列,它可以包含任意的数据,包括0值字节,但主要是人类可以阅读的文本.golang中默认字符串被解读为utf-8编码的Unicode码点(文字符号 ...

  7. 【Docker】第四篇 Docker仓库管理

    一.仓库概述 仓库(Repository):Docker仓库主要用于镜像的存储,它是镜像分发.部署的关键.仓库分为公共仓库和私有仓库. 注册服务器(Registry)和仓库区别:注册服务器上往往存放着 ...

  8. 机器学习基础 --- pandas的基本使用

    一.pandas的简介 Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的.Pandas 纳入了大量库和一些 ...

  9. c++虚继承与虚函数

    学习继承与多态时看到这两个概念,记录整理. 虚继承与虚函数都是用virtual关键字实现,虚继承为了防止多重继承,而虚函数为了实现多态. 是几个例子. 虚继承: class A{}; class B: ...

  10. truffle Dapp 搭建

    安装truffle $ npm install -g truffle 依赖环境 NodeJS 访问https://nodejs.org 官方网站下载安装 系统:Windows, Linux or Ma ...