【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维向量,是的可行域,是上的实值函数.凸优化问题是指是闭合的凸集且是上的凸函数的最优化问题,这两个条件任一不满足则该问题即为非凸的最优化问题. 其中,是 凸 ...
随机推荐
- TPO-19 C1 Discussing A Point Raised In A Lecture
TPO-19 C1 Discussing A Point Raised In A Lecture 第 1 段 1.Listen to a conversation between a student ...
- 学习笔记 | Set
目录 Set Set 前言 不会数据结构选手 当几乎没写过什么数据结构的菜鸡遇上了毒瘤的splay和treap 时间正一点一点地被续走TAT 听说set有时候可以替代treap和splay 那么菜鸡L ...
- Apache 性能配置优化
前言 最近在进行apache性能优化设置.在修改apache配置)文件之前需要备份原有的配置文件夹conf,这是网站架设的好习惯.以下的apache配置调优均是在red had的环境下进行的. htt ...
- Google hack语法
基础语法: 1.语法说明: inurl: 在url地址栏中显示的信息页面 intext: 显示在正文信息中的内容页面 site: 限制显示你某个域名的所有页面 filetype: 搜索文件的后缀或者扩 ...
- 微信小程序开发调试技巧
1. 查看线上小程序console a. 先打开开发小程序console b. 再打开线上小程序,此时可以查看console
- Linux系统下安装jdk1.8
JDK安装分为两种方式 一种是解压tar.gz配置安装, 一种是rpm安装,我这里是tar.gz安装方式 一.首先在oracle官方网下载jdk,网址如下:http://www.oracle.com ...
- bash登录过程 其实还不太了解,先码后看
在刚登录Linux时,首先启动 /etc/profile 文件,然后再启动用户目录下的 ~/.bash_profile. ~/.bash_login或 ~/.profile文件中的其中一个,执行的顺序 ...
- PSP Daily软件beta版本——基于NABCD评论,及改进建议
1.根据(不限于)NABCD评论作品的选题: 此软件的用户人群较为明确,即:用户(软件工程课上学生)记录例行报告.写每周PSP表格和统计的需求.潜在用户还有未来该课堂的学生和需要用PSP方法记录任务完 ...
- Data truncation: Truncated incorrect DOUBLE value:
在写sql查询语句queryRunner.update(connection,"update account set balance=? where name=?",account ...
- 实验1 熟悉Linux开发环境 实验报告
参见http://www.cnblogs.com/lhc-java/p/4970269.html