bzoj 1196: [HNOI2006]公路修建問題
阿新 • • 發佈:2019-02-10
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> usingnamespace 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]公路修建問題