codeforces

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的更多相关文章

  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(凸优化,最小生成树)

    [CF125E]MST Company(凸优化,最小生成树) 题面 洛谷 CF 题解 第一眼看见就给人丽洁姐那道\(tree\)一样的感觉. 那么二分一个权值,加给所有有一个端点是\(1\)的边, 然 ...

  5. CodeForces 125E MST Company

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

  6. CODEFORCES 125E MST Company 巧用Kruskal算法

    题意:给定一个带权边无向图,求最小生成树,且满足第一个节点的度为固定的k 无解则输出-1 数据规模: 节点数n和限制k<=5000 边数m<=10^5 时限8sec 思路: 首先时限比较宽 ...

  7. DP学习记录Ⅱ

    DP学习记录Ⅰ 以下为 DP 的优化. 人脑优化DP P5664 Emiya 家今天的饭 正难则反.考虑计算不合法方案.一个方案不合法一定存在一个主食,使得该主食在多于一半的方法中出现. 枚举这个&q ...

  8. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  9. codeforces 125 A-E 补题

    A Measuring Lengths in Baden 进制转换 水题 #include<bits/stdc++.h> using namespace std; int main() { ...

随机推荐

  1. 在HTML代码中要如何插入空格?

    超文本标记语言(HTML)会自动忽略空格.平常在编写代码的时候,用空格键.Tab键以及回车键产生的空格,都会被HTML自动忽略.那么我们该用什么方法来实现HTML的空格效果呢?有专门的空格代码吗?不少 ...

  2. 20172305 2018-2019-1 《Java软件结构与数据结构》第二周学习总结

    20172305 2018-2019-1 <Java软件结构与数据结构>第二周学习总结 教材学习内容总结 本周内容主要为书第三章和第四章的内容: 第三章(以数组来替代栈的作用) 集合(聚集 ...

  3. InstallShield的工程类型的选择

    转载:http://blog.csdn.net/wuxiaoqrs/article/details/45717695 InstallScript vs. Basic MSI InstallScript ...

  4. 2012NOIP模拟试题

    做的时候觉得这套题好简单,结果一看发现是2012年的模拟题,估计就是普及+的难度吧,AK无压力 总结 第一题状压我智障的调了好几分钟,因为我的最终状态写的1<<n,智障了 第三题的dfs调 ...

  5. sudo环境变量问题;程序库函数寻找

    1. sudo 和 root不完全等效,继承的环境变量不一样,最主要的区别还是输入的密码不同. 2. 使用sudo去执行一个程序时,出于安全的考虑,这个程序将在一个新的.最小化的环境中执行,也就是说, ...

  6. ubuntu 14.04 (desktop amd 64) 查看配置参数

    硬盘型号 sudo hdparm -i /dev/sda |grep "Model"   硬盘数量大小 sudo fdisk -l |grep "Disk /dev/sd ...

  7. (GoRails)ActionCable如何用Redis + 菜鸟redis教程

    视频: https://gorails.com/episodes/how-actioncable-uses-redis?autoplay=1 原理PubSub, 你进入一个频道,然后就能接收,和发布信 ...

  8. Android之第三方平台实现QQ登录和QQ分享

    目前大多数APP都包含了第三方平台的登录,特别是QQ和微信,这篇博客主要讲的是如何实现QQ第三方平台实现QQ登录和分享功能,功能包含: 登录授权登录获取用户信息(昵称,头像,地址等) QQ分享给好友 ...

  9. 用pycharm提交代码,冲突之后文件丢失找回方法

    1: 更新代码时, 监测到本地代码改变,需要和合并,重启之后才可以, 选择No同时,代码会被冲掉,新增加的文件也会被冲掉, 但是pycharm有一个文件历史记忆,找到之后可以找到丢失的文件. 1: 选 ...

  10. Java中字符串比较的注意点

    Java中必须使用string1.equals(string2)来进行判断 补充如果: string s1=new String("Hello"); string s2=new S ...