http://www.lydsy.com/JudgeOnline/problem.php?id=1196

二分+并查集

一共有2*M条路径,我们首先将这2*M条路径按费用排序。

然后二分最大费用的公路mid

变成判断性问题:能否只用第1到第mid条公路,使得生成树至少包含K条一级公路。

因为这时候已经跟费用无关了,我们优先选取一级公路即可。

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<utility>
#include<set>
#include<bitset>
#include<vector>
#include<functional>
#include<deque>
#include<cctype>
#include<climits>
#include<complex>
//#include<bits/stdc++.h>适用于CF,UOJ,但不适用于poj using namespace std; typedef long long LL;
typedef double DB;
typedef pair<int,int> PII;
typedef complex<DB> CP; #define mmst(a,v) memset(a,v,sizeof(a))
#define mmcy(a,b) memcpy(a,b,sizeof(a))
#define fill(a,l,r,v) fill(a+l,a+r+1,v)
#define re(i,a,b) for(i=(a);i<=(b);i++)
#define red(i,a,b) for(i=(a);i>=(b);i--)
#define ire(i,x) for(typedef(x.begin()) i=x.begin();i!=x.end();i++)
#define fi first
#define se second
#define m_p(a,b) make_pair(a,b)
#define SF scanf
#define PF printf
#define two(k) (1<<(k)) template<class T>inline T sqr(T x){return x*x;}
template<class T>inline void upmin(T &t,T tmp){if(t>tmp)t=tmp;}
template<class T>inline void upmax(T &t,T tmp){if(t<tmp)t=tmp;} const DB EPS=1e-;
inline int sgn(DB x){if(abs(x)<EPS)return ;return(x>)?:-;}
const DB Pi=acos(-1.0); inline int gint()
{
int res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
return (neg)?-res:res;
}
inline LL gll()
{
LL res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
return (neg)?-res:res;
} const int maxN=;
const int maxM=*; int N,K,M;
struct Troad
{
int x,y,id,p,cost;
inline Troad(int _id=,int _p=,int _x=,int _y=,int _cost=){id=_id;p=_p;x=_x;y=_y;cost=_cost;}
}road[maxM+]; inline bool cmpcost(Troad a,Troad b){return a.cost<b.cost;} int pa[maxN+];
inline int findroot(int a){return pa[a]<?a:pa[a]=findroot(pa[a]);}
inline void uni(int a,int b)
{
int f1=findroot(a),f2=findroot(b);
if(f1==f2)return;
if(pa[f1]>pa[f2])swap(f1,f2);
pa[f1]+=pa[f2];
pa[f2]=f1;
} inline int check(int mid)
{
int i,cnt=;
mmst(pa,-);
re(i,,mid)
if(road[i].p==)
if(findroot(road[i].x)!=findroot(road[i].y))
{
uni(road[i].x,road[i].y);
cnt++;
}
if(cnt<K)return ;
re(i,,mid)uni(road[i].x,road[i].y);
re(i,,N)if(findroot(i)!=findroot())return ;
return ;
} struct Tout
{
int id,p;
inline Tout(int _id=,int _p=){id=_id;p=_p;}
}out[maxN+];
int ge;
inline bool cmpid(Tout a,Tout b){return a.id<b.id;} int main()
{
freopen("road.in","r",stdin);
freopen("road.out","w",stdout);
int i;
N=gint();K=gint();M=gint();
re(i,,M)
{
int x=gint(),y=gint(),c1=gint(),c2=gint();
road[*i-]=Troad(i,,x,y,c1);
road[*i]=Troad(i,,x,y,c2);
}
M*=;
sort(road+,road+M+,cmpcost);
int l=,r=M,mid;
while(l<=r)
{
mid=(l+r)>>;
if(check(mid))r=mid-;else l=mid+;
}
cout<<road[l].cost<<endl;
mmst(pa,-);
re(i,,l)
if(road[i].p==)
if(findroot(road[i].x)!=findroot(road[i].y))
{
uni(road[i].x,road[i].y);
out[++ge]=Tout(road[i].id,road[i].p);
}
re(i,,l)if(findroot(road[i].x)!=findroot(road[i].y))
{
uni(road[i].x,road[i].y);
out[++ge]=Tout(road[i].id,road[i].p);
}
sort(out+,out+ge+,cmpid);
re(i,,ge)cout<<out[i].id<<" "<<out[i].p<<endl;
return ;
}

bzoj 1196的更多相关文章

  1. bzoj 1196 公路修建问题

    bzoj 1196: [HNOI2006]公路修建问题 Description OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多.然而,由于该岛屿刚刚开发不久,所以那里的交通情 ...

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

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

  3. BZOJ 1196 [HNOI2006]公路修建问题(二分答案+并查集)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1196 [题目大意] 对于每条可能维修的公路可选择修一级公路或者二级公路,价值不同 要求 ...

  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 二分答案+并查集

    http://www.lydsy.com/JudgeOnline/problem.php?id=1196 题目大意:n个城市,m-1条路,每条路有一级公路和二级公路之分,你要造n-1条路,一级公路至少 ...

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

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

  8. BZOJ 1196 [HNOI2006]公路修建问题:二分 + 贪心生成树check(类似kruskal)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1196 题意: n个城市,m对城市之间可以修公路. 公路有两种,一级公路和二级公路,在第i对 ...

  9. bzoj 1196 二分+生成树判定

    我们先二分一个答案,对于每个答案,先加一级公路,如果不够k直接break, 然后再加二级公路,加的过程类似Kruskal. /************************************* ...

随机推荐

  1. GF(2^8)乘法

    最近在学AES,实现了一下伽罗瓦域(2^8)乘法. 至于什么是伽罗瓦域解释起来比较复杂,我也不一定能解释清楚,自行google.这里只是给出一个简单直观的实现. #include<iostrea ...

  2. Codeforces 460 DE 两道题

    D Little Victor and Set 题目链接 构造的好题.表示是看了题解才会做的. 假如[l,r]长度不超过4,直接暴力就行了. 假如[l,r]长度大于等于5,那么如果k = 1,显然答案 ...

  3. Java中静态数据的初始化顺序

    Java的类中的数据成员中包含有静态成员(static)时,静态数据成员的初始化顺序是怎样的呢? [程序实例1] import java.util.*; import java.lang.*; imp ...

  4. 【转】MVC5中的区域(Areas)

    MVC本身提倡的就是关注点分离.但是当项目本身的业务逻辑足够复杂,如果所有的业务逻辑都写个Controller文件夹下面的时候,你会看到非常庞大的各种命名的Controller,这个时候区域的作用就非 ...

  5. Apache HttpComponents Client 4.0快速入门/升级-2.POST方法访问网页

    Apache HttpComponents Client 4.0已经发布多时,httpclient项目从commons子项目挪到了HttpComponents子项目下,httpclient3.1和 h ...

  6. (3)选择元素——(15)总结(Summary)

    With the techniques that we have covered in this chapter, we should now be able to locate sets of el ...

  7. [Polymer] Introduction

    install Polymer and explore creating our first custom element: bower install polymer index.html: < ...

  8. android studio 更改快捷键为eclipse中习惯的方式

    虽然之前看了不少android studio的快捷键,但主要开发依然还是在eclipse上,仍然不习惯android studio的快捷键方式,今天看一视频说可以改快捷键为eclipse的方式,不由得 ...

  9. 第三章 Android绘图机制与处理技巧

    1.屏幕尺寸信息 屏幕大小:屏幕对角线长度,单位“寸”:分辨率:手机屏幕像素点个数,例如720x1280分辨率:PPI(Pixels Per Inch):即DPI(Dots Per Inch),它是对 ...

  10. asp.net 5.0微信支付

    (原文出自:http://lib.csdn.net/article/wechat/46329) 微信支付官方坑太多,我们来精简 我把官方的代码,打包成了 an.wxapi.dll. 里面主要替换了下注 ...