\(\\\)

\(Description\)


一个\(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<cmath>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 10010
#define M 20010
#define R register
#define gc getchar
using 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<y.w1;} inline bool cmp2(edge x,edge y){return min(x.w1,x.w2)<min(y.w1,y.w2);} inline bool cmp3(result x,result y){return x.p<y.p;} struct UFS{
int f[N];
UFS(){for(R int i=1;i<N;++i) f[i]=i;}
int find(int x){return x==f[x]?x:f[x]=find(f[x]);}
inline void merge(int x,int y){f[find(x)]=find(y);}
inline bool judge(int x,int y){return find(x)==find(y);}
}ufs; int main(){
n=rd(); k=rd(); m=rd()-1;
for(R int i=1;i<=m;++i){
e[i].x=rd(); e[i].y=rd();
e[i].num=i; e[i].w1=rd(); e[i].w2=rd();
}
if(m){
sort(e+1,e+1+m,cmp1);
for(R int i=1;i<=m;++i)
if(!ufs.judge(e[i].x,e[i].y)){
ufs.merge(e[i].x,e[i].y);
ans[++tot].p=e[i].num; ans[tot].x=1;
res=max(res,e[i].w1); if((++cnt)==k) break;
}
}
if(cnt<n-1){
sort(e+1,e+1+m,cmp2);
for(R int i=1;i<=m;++i)
if(!ufs.judge(e[i].x,e[i].y)){
ufs.merge(e[i].x,e[i].y);
ans[++tot].p=e[i].num;
if(e[i].w1<e[i].w2){ans[tot].x=1;res=max(res,e[i].w1);}
else{ans[tot].x=2;res=max(res,e[i].w2);}
}
}
printf("%d\n",res);
sort(ans+1,ans+1+tot,cmp3);
for(R int i=1;i<=tot;++i) printf("%d %d\n",ans[i].p,ans[i].x);
return 0;
}

[ HNOI 2006 ] 公路修建问题的更多相关文章

  1. COGS 2416.[HZOI 2016]公路修建 & COGS 2419.[HZOI 2016]公路修建2 题解

    大意: [HZOI 2016]公路修建 给定一个有n个点和m-1组边的无向连通图,其中每组边都包含一条一级边和一条二级边(连接的顶点相同),同一组边中的一级边权值一定大于等于二级边,另外给出一个数k( ...

  2. BZOJ-1196 公路修建问题 最小生成树Kruskal+(二分??)

    题目中一句话,最大费用最小,这么明显的二分的提示(by 以前morestep学长的经验传授)...但完全没二分,1A后感觉很虚.. 1196: [HNOI2006]公路修建问题 Time Limit: ...

  3. 【最小生成树】BZOJ 1196: [HNOI2006]公路修建问题

    1196: [HNOI2006]公路修建问题 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1435  Solved: 810[Submit][Sta ...

  4. bzoj 1196: [HNOI2006]公路修建问题 二分+并查集

    题目链接 1196: [HNOI2006]公路修建问题 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1576  Solved: 909[Submit ...

  5. BZOJ 1196: [HNOI2006]公路修建问题( MST )

    水题... 容易发现花费最大最小即是求 MST 将每条边拆成一级 , 二级两条 , 然后跑 MST . 跑 MST 时 , 要先加 k 条一级road , 保证满足题意 , 然后再跑普通的 MST . ...

  6. BZOJ_1196_[HNOI2006]公路修建问题_kruskal+二分答案

    BZOJ_1196_[HNOI2006]公路修建问题_kruskal+二分答案 题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1196 分析: ...

  7. 洛谷P1265 公路修建(Prim)

    To 洛谷.1265 公路修建 题目描述 某国有n个城市,它们互相之间没有公路相通,因此交通十分不便.为解决这一“行路难”的问题,政府决定修建公路.修建公路的任务由各城市共同完成. 修建工程分若干轮完 ...

  8. BZOJ 1196: [HNOI2006]公路修建问题 Kruskal/二分

    1196: [HNOI2006]公路修建问题 Time Limit: 1 Sec  Memory Limit: 162 MB 题目连接 http://www.lydsy.com/JudgeOnline ...

  9. 洛谷P2323 [HNOI2006] 公路修建问题 [二分答案,生成树]

    题目传送门 公路修建问题 题目描述 OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多.然而,由于该岛屿刚刚开发不久,所以那里的交通情况还是很糟糕.所以,OIER Associa ...

随机推荐

  1. 【06】AngularJS 控制器

    AngularJS 控制器 AngularJS 控制器 控制 AngularJS 应用程序的数据. AngularJS 控制器是常规的 JavaScript 对象. AngularJS 控制器 Ang ...

  2. LightOJ 1348 Aladdin and the Return Journey

    Aladdin and the Return Journey Time Limit: 2000ms Memory Limit: 32768KB This problem will be judged ...

  3. better-scroll & scroll

    scroll better-scroll https://github.com/ustbhuangyi/better-scroll/blob/master/README.md#getting-star ...

  4. 备用交换机(cogs 8)

    [问题描述] n个城市之间有通讯网络,每个城市都有通讯交换机,直接或间接与其它城市连接.因电子设备容易损坏,需给通讯点配备备用交换机.但备用交换机数量有限,不能全部配备,只能给部分重要城市配置.于是规 ...

  5. A^B Mod C

    基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出3个正整数A B C,求A^B Mod C.   例如,3 5 8,3^5 Mod 8 = 3. Input 3个正整 ...

  6. da,da_driver

    daSet=session.query(da).all() for da in daSet: da.mount_list=map(lambda x:x.mount_point , x for x in ...

  7. Centos7 上安装mysql遇上的问题:mysql无法正常启动

    第一次在Centos上安装mysql遇到的一些问题. 第一步就遇到问题,安装mysql-server报错没有可用包.  [解决方法] 先要安装mysql # wget http://repo.mysq ...

  8. IOS--JSON数据解析成字典

    JSON解析成字典 {} –>字典 [] –>数组 ""–>字符串 11/11.1–>NSNumber true/false –>NSNumber n ...

  9. HDU 5100 Chessboard 用 k &#215; 1 的矩形覆盖 n &#215; n 的正方形棋盘

    pid=5100">点击打开链接 Chessboard Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32 ...

  10. Flash--元件和实例

    1.元件简述: 元件在Flash影片中是一种特殊的对象.在Flash中仅仅须要创建一次,然后能够在整部电影中重复使用而不会显著添加 文件大小. 事实上在使用元件时,我们一般使用的是该元件的实例,所以说 ...