题意翻译

求一种特殊的最小生成树。给定一个有n个节点和m条边的图,找出一个生成树满足从根节点1直接连向其余节点的边要恰好是k条,在此条件下生成树的权值和最小。

输入输出样例

输入样例#1:

4 5 2
1 2 1
2 3 1
3 4 1
1 3 3
1 4 2

输出样例#1:

3
1 5 2


话说我一开始以为和免费道路那题一样直接上3遍\(kruskal\)但一直WA14

然后就去看了题解

发现正解是二分 + \(kruskal\)

具体思路就是每次给起点为1的边二分一个值

让所有的起点为1的边都减去这个值

因为\(kruskal\)要先按照边权排序

所以减去二分的值以后边的排名就会发生改变

然后判断是否能选到k条起点为1的边

然后注意判断无解的情况

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
const int M = 200005 ;
using namespace std ;
inline int read() {char c = getchar() ; int x = 0 , w = 1 ;while(c>'9'||c<'0') { if(c=='-') w = -1 ; c = getchar() ; }while(c>='0'&&c<='9') { x = x*10+c-'0' ; c = getchar() ; }return x*w ;
} int n , m , k ;
int Num1 , upp , f[M] , tot , Num , Ans[M] ;
struct E {int from , to , dis , Id ;
} edge[M] ;
inline bool operator < (E a , E b) { return a.dis == b.dis ? a.from < b.from : a.dis < b.dis ; }
int find(int x) { if(f[x] != x) f[x] = find(f[x]) ; return f[x] ;  }
inline int chk(int mid) {for(int i = 1 ; i <= m ; i ++) if(edge[i].from == 1) edge[i].dis += mid ;for(int i = 1 ; i <= n ; i ++) f[i] = i ;tot = 0 , Num = 0 ;sort(edge + 1 , edge + m + 1) ;for(int i = 1 , u , v , x , y ; i <= m ; i ++) {u = edge[i].from , v = edge[i].to ;x = find(u) , y = find(v) ;if(x == y) continue ;f[y] = x ; ++tot ; if(u == 1) ++Num ;if(tot == n - 1) break ;}for(int i = 1 ; i <= m ; i ++)if(edge[i].from == 1)edge[i].dis -= mid ;return Num ;
}
inline bool query(int mid) {for(int i = 1 ; i <= m ; i ++)if(edge[i].from == 1)edge[i].dis += mid ;for(int i = 1 ; i <= n ; i ++) f[i] = i ;tot = 0 , Num = 0 ;sort(edge + 1 , edge + m + 1) ;for(int i = 1 , u , v , x , y ; i <= m ; i ++) {u = edge[i].from , v = edge[i].to ;x = find(u) , y = find(v) ;if(x == y) continue ;if(u == 1 && Num == k) continue ;f[y] = x ; if(u == 1) ++Num ;Ans[++tot] = edge[i].Id ;if(tot == n - 1) break ;}if(Num < k || tot != n - 1) return false ;return true ;
}
int main() {n = read() ; m = read() ; k = read() ;for(int i = 1 ; i <= m ; i ++) {edge[i].from = read() , edge[i].to = read() ;edge[i].dis = read() ; edge[i].Id = i ;if(edge[i].from > edge[i].to) swap(edge[i].from , edge[i].to) ;if(edge[i].from == 1) ++Num1 ;}int l = -100001 , r = 100001 ;while(l <= r) {int mid = (l + r) >> 1 ;if(chk(mid) >= k) l = mid + 1 , upp = mid ;else r = mid - 1 ;}if(upp < -100001) { printf("-1\n") ; return 0 ; }if(!query(upp)) { printf("-1\n") ; return 0 ;  }printf("%d\n",n - 1) ;for(int i = 1 ; i < n ; i ++) printf("%d ",Ans[i]) ;return 0 ;
}

转载于:https://www.cnblogs.com/beretty/p/9703066.html

CF125E MST Company相关推荐

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

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

  2. [CF125E]MST Company

    题意:求一种特殊的最小生成树.给定一个有你$n$个节点和$m$条边的图,找出一个生成树满足从根节点1直接连向其余节点的边要恰好是$k$条,在此条件下生成树的权值和最小. 二分一个数$x$,给每条与1相 ...

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

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

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

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

  5. php修改时区MST,4、修改Cacti绘图的时间精度

    一.前言 前面几篇记录了怎么去安装Cacti,这篇呢主要记录下如何修改Cacti绘图的精度,注意是绘图的精度而不是轮询的精度.在开始写这篇笔记的时候首先得谢谢帮助我解决PHP问题的ikodota. C ...

  6. 见到了“公司”定义一个Company类,那么见到了“字段”是不是也可定义一个Column类?...

    既然见到了公司,我们可以定义一个Class Company ,那么我们见到了字段,是不是也可以定义一个Class ColumnInfo呢? 公司的描述信息类: 代码 public class Comp ...

  7. 博世力士乐液压_[Event Review] Company Visit Bosch Rexroth 博世力士乐液压工厂参观

    Event Review Company Visit:  Bosch Rexroth (Beijing) Hydraulic Co. Ltd.  博世力士乐(北京)液压有限公司 April 24, 2 ...

  8. SAP MM 执行事务代码MRRL报错-No message was found for partner 100065 company code 0001-

    SAP MM 执行事务代码MRRL报错-No message was found for partner 100065 company code 0001- 1, 执行事务代码MRRL 触发invoi ...

  9. SAP MM 物料库存转固定资产,报错:You cannot post to asset in company code 1900 fiscal year 2021

    SAP MM 物料库存转固定资产,报错:You cannot post to asset in company code 1900 fiscal year 2021 使用事务代码MIGO,移动类型24 ...

  10. SAP IDoc Post不成功,报错 - A company code cannot be determined for LI 0000100061 –

    SAP IDoc Post不成功,报错 - A company code cannot be determined for LI 0000100061 – IDoc#4096出现如下报错:A comp ...

最新文章

  1. “清华数为”工业时序数据库IoTDB与DWF应用开发寒假师资培训圆满结束
  2. s2sh集成dataSource配置无效的问题 -Access denied for user 'sa'@'localhost'
  3. Windows下启动停止SQL Server 2005服务
  4. Java提升篇:理解String 及 String.intern() 在实际中的应用
  5. Wannafly挑战赛22 D 整数序列 (线段树维护三角函数值)
  6. 使用c++查看linux服务器某个进程正在使用的内存_Linux 系统管理
  7. 协议簇:Ethernet Address Resolution Protocol (ARP) 解析
  8. 一段简单的代码告诉你什么叫内存溢出
  9. rpm方式在centos7中安装mysql
  10. FastDFS点滴记录
  11. 文本居于图片左侧html,CSS实现图片与文本的居中对齐的常见方式
  12. “咕”了 73 天,何同学终于回归:最喜欢 3D 打印机,但不要买
  13. SQL检索MongoDB的轻量级解决方案
  14. 信息化与计算机基础课课堂融合,高等学校计算机基础课程多元教学系列教材:网页设计与制作...
  15. 利用橡皮擦进行PS抠图的方法教程
  16. app录制回放 jmeter_Jmeter使用之脚本录制回放
  17. 【web前端】20.手机端网页禁止长按图片保存图片
  18. sql server 2000收缩数据库【极简操作】
  19. bzoj3772: 精神污染
  20. 一个曾讨厌英语的人是如何爱上英语学好英语的

热门文章

  1. 【大数据部落】基于随机森林、svm、CNN机器学习的风控欺诈识别模型
  2. smale学习之数学表达式(day2)
  3. (2)Matplotlib_bar, barh
  4. Linux学习笔记(12)
  5. Caffe for Python 官方教程(翻译)
  6. python之word2vec实战学习
  7. 2021-07-01样式和图片标签
  8. 2021-06-27循环控制 mapSet
  9. 2021-06-16异步调用 CompletableFuture
  10. latex table 表格 文字太长 自动换行