\(\\\)

\(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. Maven_在Eclipse中执行Maven命令

  2. mySQL and sqoop for ubuntu

    数据的导入导出 ——MySQL & sqoop in Ubuntu 1.完成搭建hadoop集群 2.安装MySQL sudo apt-get install mysql-server mys ...

  3. noip模拟赛 戏

    [问题背景]zhx 和他的妹子(们) 做游戏.[问题描述]考虑 N 个人玩一个游戏,任意两个人之间进行一场游戏(共 N*(N-1)/2 场),且每场一定能分出胜负.现在, 你需要在其中找到三个人构成“ ...

  4. tyvj1271 零式求和

    描述 请考虑一个由1到N(N=3, 4, 5 ... 9)的数字组成的递增数列:1 2 3 ... N.现在请在数列中插入“+”表示加,或者“-”表示减,抑或是“ ”表示空白(例如1-2 3就等于1- ...

  5. java多线程编程核心技术(三)--线程间通信

    1.等待/通知机制 1.wait()方法:使当前执行代码的线程进行等待.wait()方法是Object类的方法,该方法将当前线程放入“预执行队列”中,并在wait()所处的代码行处停止执行.只到被唤起 ...

  6. android获取年月日时分秒

    Calendar calendar=Calendar.getInstance(); //获取当前时间,作为图标的名字 String year=calendar.get(Calendar.YEAR)+& ...

  7. A+B Problem IV

    描述acmj最近发现在使用计算器计算高精度的大数加法时很不方便,于是他想着能不能写个程序把这个问题给解决了.   输入 包含多组测试数据每组数据包含两个正数A,B(可能为小数且位数不大于400) 输出 ...

  8. PHP htmlentities 和 htmlspecialchars的区别

    一直对这两个转换htm字符为html实体的函数混淆不清,查询了一下文档,总结如下 htmlentities: Convert all applicable characters to HTML ent ...

  9. InnoDB: Error: Table &quot;mysql&quot;.&quot;innodb_table_stats&quot; not found.

    1,Mysqldump的时候报错例如以下: 2014-05-05 14:12:37 7f004a9a2700 InnoDB: Error: Table "mysql"." ...

  10. 【cocos2dx 小技巧】半透明屏蔽罩和弹出框的实现

    今天介绍一下,弹出框的和屏蔽罩的小实现~ 弹出框主要用到了cocos2dx生命周期里面的OnEnter()函数,就是当Layer被addChild的时候会调用的函数(所以假设把OnEnter的代码加到 ...