[CF125E]MST Company
description
给出一张\(n\)点\(m\)条边的无向图,求一棵满足\(1\)号点度数恰好为\(k\)的最小生成树,并输出方案。
\(1\le k\le n\le5000,m\le100000\)
sol
二分一个权值,给每条连接\(1\)号点的边的边权加上这个权值,跑最小生成树即可。
输出方案有点恶心,需要合理控制同边权的边的选取。
code
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int gi(){
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
const int N = 1e5+5;
struct edge{
int u,v,w,id;
bool operator < (const edge &b) const
{return w==b.w?u<b.u:w<b.w;}
}E[N];
int n,m,k,fa[N],vis[N],ans,tot;
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
int solve(int c){
for (int i=1;i<=m;++i) if (E[i].u==1) E[i].w+=c;
sort(E+1,E+m+1);tot=0;
for (int i=1;i<=n;++i) fa[i]=i;
for (int i=1;i<=m;++i)
if (find(E[i].u)!=find(E[i].v)){
fa[find(E[i].u)]=find(E[i].v);
tot+=E[i].u==1;
}
for (int i=1;i<=m;++i) if (E[i].u==1) E[i].w-=c;
return tot;
}
void getans(int c){
for (int i=1;i<=m;++i) if (E[i].u==1) E[i].w+=c;
sort(E+1,E+m+1);tot=ans=0;
for (int i=1;i<=n;++i) fa[i]=i;
for (int i=1;i<=m;++i)
if (find(E[i].u)!=find(E[i].v)&&tot+(E[i].u==1)<=k){
fa[find(E[i].u)]=find(E[i].v);
++ans;tot+=E[i].u==1;vis[i]=1;
}else vis[i]=0;
if (ans<n-1||tot<k) {puts("-1");return;}
printf("%d\n",n-1);
for (int i=1;i<=m;++i) if (vis[i]) printf("%d ",E[i].id);
puts("");
}
int main(){
n=gi();m=gi();k=gi();
for (int i=1;i<=m;++i){
int u=gi(),v=gi(),w=gi();
if (u>v) swap(u,v);
E[i]=(edge){u,v,w,i};
}
int L=-N,R=N,P=1e9;
while (L<=R){
int mid=L+R>>1;
if (solve(mid)>=k) P=mid,L=mid+1;else R=mid-1;
}
if (P==1e9) return puts("-1"),0;
getans(P);
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(凸优化,最小生成树)
[CF125E]MST Company(凸优化,最小生成树) 题面 洛谷 CF 题解 第一眼看见就给人丽洁姐那道\(tree\)一样的感觉. 那么二分一个权值,加给所有有一个端点是\(1\)的边, 然 ...
- CodeForces 125E MST Company
E. MST Company time limit per test 8 seconds memory limit per test 256 megabytes input standard inpu ...
- CODEFORCES 125E MST Company 巧用Kruskal算法
题意:给定一个带权边无向图,求最小生成树,且满足第一个节点的度为固定的k 无解则输出-1 数据规模: 节点数n和限制k<=5000 边数m<=10^5 时限8sec 思路: 首先时限比较宽 ...
- DP学习记录Ⅱ
DP学习记录Ⅰ 以下为 DP 的优化. 人脑优化DP P5664 Emiya 家今天的饭 正难则反.考虑计算不合法方案.一个方案不合法一定存在一个主食,使得该主食在多于一半的方法中出现. 枚举这个&q ...
- Noip前的大抱佛脚----赛前任务
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
- codeforces 125 A-E 补题
A Measuring Lengths in Baden 进制转换 水题 #include<bits/stdc++.h> using namespace std; int main() { ...
随机推荐
- cocos代码研究(16)Widget子类RadioButton学习笔记
理论基础 RadioButton是一种特定类型的两状态按钮,它与复选框相似.它可以 和RadioButtonGroup一起使用,形成一个"组".继承自AbstractCheckBu ...
- SQL: coalesce()函数
①用途: 将空值替换成其他值 返回第一个非空值 ②表达式: COALESCE是一个函数, (expression_1, expression_2, ...,expression_n)依次参考各参数表达 ...
- Python tricks(1) -- 动态定义一个新变量
python是动态语言, 无需声明变量即可使用. 传递一个tuple, list或者dict等等方式, 有时候这种方式的使用不是很好. 对于tuple和list来说都是用下标的访问方式(即使用[]), ...
- office 2010 安装时出错 MSXML版本6.10.1129.0
微软下载网址:https://www.microsoft.com/zh-cn/download/details.aspx?id=6276&751be11f-ede8-5a0c-058c-2ee ...
- 20145303 刘俊谦《网络对抗》逆向及BOF基础实践
20145303 刘俊谦<网络对抗>逆向及BOF基础实践 1 逆向及Bof基础实践说明 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调 ...
- Knockout 模板使用
html 代码: @using GreenWay.Models; @{ Model.Scripts = new string[] { "~/Scripts/paginationViewMod ...
- 《EMCAScript6入门》读书笔记——14.Promise对象
- kylin-cube存储结构
前言 本篇文章通过图文的方式分析不同维度组合下的cube在hbase中的存储结构 需要声明的是,kylin不存原始数据,存储cube 全维度构建 假设一张表有3个字段name,age,sex,那么当通 ...
- Windows 搭建 Linux kernal0.11 环境
下载:http://www.oldlinux.org/Linux.old/bochs/ 安装bochs 运行 界面:
- json文件为空时读取会报错
simplejson.errors.JSONDecodeError: Expecting value: line column () 提示说是解码错误 可以用下面的方法判断json文件是否为空 imp ...