1. 程式人生 > >bzoj 1196: [HNOI2006]公路修建問題

bzoj 1196: [HNOI2006]公路修建問題

lin zoj nbsp for bsp ted ons main get

abcdefg

/**************************************************************
    Problem: 1196
    User: lxy8584099
    Language: C++
    Result: Accepted
    Time:224 ms
    Memory:1176 kb
****************************************************************/
 
/*
    二分答案檢查一級公路和連通性
*/
#include<cstdio>
using
namespace std; const int N=1e4+50; int n,m,k,fa[N],tot,num,cnt; struct pp {int u,v,c1,c2;} e[N<<1]; inline int get(int x) {return fa[x]==x?x:fa[x]=get(fa[x]);} inline bool check(int mid) { int cnt=0; for(int i=1;i<=n;i++) fa[i]=i; for(int i=1;i<m;i++) {
if(e[i].c1>mid) continue; int u=get(e[i].u),v=get(e[i].v); if(u!=v) fa[v]=u,cnt++; } if(cnt<k) return 0; for(int i=1;i<m;i++) { if(e[i].c2>mid) continue; int u=get(e[i].u),v=get(e[i].v); if(u!=v) fa[v]=u,cnt++; } if
(cnt<n-1) return 0; return 1; } int main() { scanf("%d%d%d",&n,&k,&m); for(int i=1,u,v,c1,c2;i<m;i++) { scanf("%d%d%d%d",&u,&v,&c1,&c2); e[++tot].u=u,e[tot].v=v; e[tot].c1=c1,e[tot].c2=c2; } int L=1,R=30000,ans; while(L<=R) { int mid=(L+R)>>1; if(check(mid)) ans=mid,R=mid-1; else L=mid+1; } printf("%d\n",ans); return 0; }

bzoj 1196: [HNOI2006]公路修建問題