博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[ HNOI 2006 ] 公路修建问题
阅读量:5128 次
发布时间:2019-06-13

本文共 1053 字,大约阅读时间需要 3 分钟。

\(\\\)


一个\(N\)个点\(M\)条边的图,每条边可以选择\(w_i,p_i\)两个边权之一,现求一个生成树上的最大边权最小值,要求这棵生成树上至少有\(K\)条边选择的是\(w_i\)权值。\(Luogu\)上还要以"选了哪些编号的边,每条边选择的是哪种权值"的形式求输出方案。

  • \(N\in [1,10^4]\)\(M\in [0,2\times 10^4]\)\(K\in [0,N-1]\)\(w_i,p_i\in [1,3\times 10^4]\)

\(\\\)

\(Solution\)


  • 最小生成树变形。先将边按照\(w_i\)排序,按照\(kruskal\)的方式连上\(K\)条边,再按照\(min(w_i,p_i)\)排序,连完剩下的所有边,注意第一遍连上的边要打上标记,避免使用了两次。答案即为所有连过的边中边权最大值,还要注意处理\(K=0\)\(K=N-1\)的两种情况。
  • 关于输出方案,每次记录一下就好,注意第二遍扫描的时候也可能取第一类权值。

\(\\\)

\(Code\)


#include
#include
#include
#include
#include
#include
#include
#define N 10010#define M 20010#define R register#define gc getcharusing namespace std;inline int rd(){ int x=0; bool f=0; char c=gc(); while(!isdigit(c)){if(c=='-')f=1;c=gc();} while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();} return f?-x:x;}int n,m,k,cnt,res,tot;struct edge{int x,y,w1,w2,num;}e[M];struct result{int p,x;}ans[N];inline bool cmp1(edge x,edge y){return x.w1

转载于:https://www.cnblogs.com/SGCollin/p/9672720.html

你可能感兴趣的文章
AndroidManifest.xml详解
查看>>
17-09-15模拟赛
查看>>
Educational Codeforces Round 63 Div.2 D - Beautiful Array
查看>>
11.Python标准库_多进程探索 (multiprocessing包)
查看>>
Springboot中读取properties配置
查看>>
jQuery实现简单的tab切换
查看>>
初学编程的人们看过来 [转]
查看>>
(搜索)2727:仙岛求药【待完成】
查看>>
每日linux命令学习-引用符号(反斜杠\,单引号'',双引号"")
查看>>
Java抓取网页数据(原网页+Javascript返回数据)
查看>>
【机器学习算法-python实现】决策树-Decision tree(2) 决策树的实现
查看>>
GG同步到sqlserver报错一例 Invalid date format
查看>>
jQuery总结或者锋利的jQuery笔记三
查看>>
Linux - iptables firewalld
查看>>
UVA - 540 Team Queue
查看>>
Code Complete 笔记—— 第二章 用隐喻来更充分理解软件开发
查看>>
通讯录查询(循环和if的使用) --freeCodeCamp
查看>>
微软职位内部推荐-Software Engineer II
查看>>
eXtreme Programming
查看>>
mysql explain
查看>>