【CF125E】MST Company(凸优化,最小生成树)
【CF125E】MST Company(凸优化,最小生成树)
题面
题解
第一眼看见就给人丽洁姐那道\(tree\)一样的感觉。
那么二分一个权值,加给所有有一个端点是\(1\)的边,
然后跑最小生成树\(check\)一下就好了。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
#define ll long long
#define MAX 5050
#define MAXL 100100
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
struct edge{int u,v,w,id;}e[MAXL];
bool operator<(edge a,edge b)
{
if(a.w!=b.w)return a.w<b.w;
return a.u>b.u;
}
int f[MAX],n,m,K,tot;
int getf(int x){return x==f[x]?x:f[x]=getf(f[x]);}
vector<int> g;
int Kruskal(int mid)
{
for(int i=1;i<=m;++i)if(e[i].u==1)e[i].w+=mid;
for(int i=1;i<=n;++i)f[i]=i;
int cnt=0;g.clear();sort(&e[1],&e[m+1]);
for(int i=1;i<=m;++i)
{
int u=getf(e[i].u),v=getf(e[i].v);
if(u==v)continue;
f[u]=v;g.push_back(e[i].id);
if(e[i].u==1)++cnt;
}
for(int i=1;i<=m;++i)if(e[i].u==1)e[i].w-=mid;
return cnt;
}
void Calc(int mid)
{
for(int i=1;i<=m;++i)if(e[i].u==1)e[i].w+=mid;
for(int i=1;i<=n;++i)f[i]=i;
int cnt=0,tot=0;g.clear();sort(&e[1],&e[m+1]);
for(int i=1;i<=m;++i)
{
int u=getf(e[i].u),v=getf(e[i].v);
if(u==v)continue;
if(e[i].u==1&&cnt==K)continue;
f[u]=v;g.push_back(e[i].id);
if(e[i].u==1)++cnt;++tot;
}
if(cnt<K||tot!=n-1){puts("-1");exit(0);}
}
int main()
{
n=read();m=read();K=read();
for(int i=1;i<=m;++i)
{
int u=read(),v=read(),w=read();
if(u>v)swap(u,v);if(u==1)++tot;
e[i]=(edge){u,v,w,i};
}
int l=-100000,r=100000,ret=-1e9;
while(l<=r)
{
int mid=(l+r)>>1;
int d=Kruskal(mid);
if(d<K)r=mid-1;
else l=mid+1,ret=mid;
}
if(ret<-1e5){puts("-1");return 0;}
Calc(r);printf("%d\n",n-1);
for(int i=0;i<n-1;++i)printf("%d ",g[i]);
return 0;
}
【CF125E】MST Company(凸优化,最小生成树)的更多相关文章
- luogu CF125E MST Company wqs二分 构造
LINK:CF125E MST Company 难点在于构造 前面说到了求最小值 可以二分出斜率k然后进行\(Kruskal\) 然后可以得到最小值.\(mx\)为值域. 得到最小值之后还有一个构造问 ...
- CF125E MST company (凸优化+MST)
qwq自闭的一个题 我来修锅辣!!!!!! 这篇题解!可以\(hack\)全网大部分的做法!!! 首先,我们可以把原图中的边,分成两类,一类是与\(1\)相连,另一类是不与\(1\)相连. 原题就转化 ...
- CF-125E MST Company (单度限制最小生成树)
参考红宝书 题目链接 对除 1 号点顶点外的点集,求一次最小生成森林,对于最小生成森林的联通分量,选择最短的一条边与 1 号点相连.设此时 1 号点的度为 \(k_0\),如果 \(k_0\lt L\ ...
- [CF125E]MST Company
codeforces description 给出一张\(n\)点\(m\)条边的无向图,求一棵满足\(1\)号点度数恰好为\(k\)的最小生成树,并输出方案. \(1\le k\le n\le500 ...
- 洛谷2619/bzoj2654 Tree(凸优化+MST)
bzoj的数据是真的水.. qwq 由于本人还有很多东西不是很理解 qwq 所以这里只写一个正确的做法. 首先,我们会发现,对于你选择白色边的数目,随着数目的上涨,斜率是单调升高的. 那么这时候我们就 ...
- 【BZOJ2654】Tree(凸优化,最小生成树)
[BZOJ2654]Tree(凸优化,最小生成树) 题面 BZOJ 洛谷 题解 这道题目是之前\(Apio\)的时候写的,忽然发现自己忘记发博客了... 这个万一就是一个凸优化, 给所有白边二分一个额 ...
- CodeForces 125E MST Company
E. MST Company time limit per test 8 seconds memory limit per test 256 megabytes input standard inpu ...
- 机器学习&数据挖掘笔记_15(关于凸优化的一些简单概念)
没有系统学过数学优化,但是机器学习中又常用到这些工具和技巧,机器学习中最常见的优化当属凸优化了,这些可以参考Ng的教学资料:http://cs229.stanford.edu/section/cs22 ...
- paper 110:凸优化和非凸优化
数学中最优化问题的一般表述是求取,使,其中是n维向量,是的可行域,是上的实值函数.凸优化问题是指是闭合的凸集且是上的凸函数的最优化问题,这两个条件任一不满足则该问题即为非凸的最优化问题. 其中,是 凸 ...
随机推荐
- UnityEditor扩展-右键拷贝资源路径到系统剪贴板
要点速记 命令添加到右键菜单 [MenuItem("Assets/Copy Asset Path")] 或 [MenuItem("Assets/Copy Asset Pa ...
- python3 拼接字符串的7种方法
1.直接通过(+)操作符拼接 1 2 >>> 'Hello' + ' ' + 'World' + '!' 'Hello World!' 使用这种方式进行字符串连接的操作效率低下,因为 ...
- 常用函数-filter、map、reduce、sorted
常用函数 filter map reduce sorted和列表自带sort 待续... 一.filter函数 1.说明 filter()函数接收一个函数 f 和一个可迭代对象,这个函数 f 的作用是 ...
- Windows下Visual Studio2017之AI环境搭建
本博客主要包含以下3点: AI简介及本博客主要目的 环境介绍及安装原因 搭建环境及检验是否安装成功 离线模型的训练 时间分配: 时间 时长(分钟) 收集资料+写博客 6.12 11:28-12:2 ...
- Daily Scrum3 11.5
昨天的任务已经完成,但是大家分析后发现进度稍有些慢.今天各自都在调整进度,不再拖延别人的工作. 今日任务: 杨伊:做问卷调查,准备用户体验篇内容. 徐钧鸿:把Xueba中Utility 向闸瓦移植 张 ...
- 2-Seventh Scrum Meeting20151207
任务分配 闫昊: 今日完成:完成数据库设计. 明日任务:和唐彬讨论接口如何在android实现. 唐彬: 今日完成:读了IOS讨论区后台接口. 明日任务:和闫昊讨论接口如何在android实现. 史烨 ...
- An internal error occurred during: "Launching MVC on Tomcat 7.x".
删除工作空间下的“/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.genuitec.eclipse.ast.deploy.core ...
- 炸弹人 之 N A B C D
团队开发之个人——NABCD理解 项目名称:炸弹人(app)N(need): 随着移动终端的发展,各类软件的需求必然会有长期的需求,而游戏类软件是不同年龄阶段的人共同的需求,我们将要开发的这款游 ...
- static和final
是静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只 ...
- 浅谈GIT
浅谈GIT: 牛老师提出的git,于我而言,是一个陌生和新鲜的词汇,在此之前我从未听过git,按照老师的要求,我去搜索了关于git的介绍,有些看懂了,但大部分还是不懂得,在介绍中我了解git其实之前使 ...