【分块答案】【最小生成树】【kruscal】bzoj1196 [HNOI2006]公路修建问题
2014-12-23 17:26
519 查看
二分(分块)枚举 边权上限。用kruscal判可行性。
#include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; int u[20001],v[20001],w1[20001],w2[20001],n,m,K,Limit; int fa[10001],rank[10002]; void init() { for(int i=1;i<=n;i++) fa[i]=i; memset(rank,0,(n+1)*sizeof(int)); } int findroot(int x) { if(x==fa[x]) return x; int rt=findroot(fa[x]); fa[x]=rt; return rt; } void Union(const int &U,const int &V) { if(rank[U]<rank[V]) fa[U]=V; else { fa[V]=U; if(rank[U]==rank[V]) ++rank[U]; } } bool Kruscal(int x)//仅仅需要接通即可。 { init(); int cnt=0; for(int i=1;i<=m;++i) if(w1[i]<=x) { int f1=findroot(u[i]),f2=findroot(v[i]); if(f1!=f2) { Union(f1,f2); ++cnt; if(cnt==n-1) return 1; } } if(cnt<K) return 0; for(int i=1;i<=m;++i) if(w2[i]<=x) { int f1=findroot(u[i]),f2=findroot(v[i]); if(f1!=f2) { Union(f1,f2); ++cnt; if(cnt==n-1) return 1; } } return cnt==n-1?1:0; } int main() { scanf("%d%d%d",&n,&K,&m); for(int i=1;i<=m;++i) { scanf("%d%d%d%d",&u[i],&v[i],&w1[i],&w2[i]); Limit=max(Limit,w1[i]); } int sz=sqrt(Limit),last=0; for(int i=1;last<=Limit;i+=sz) { if(Kruscal(i)) for(int j=last+1;j<=i;++j) if(Kruscal(j)) { printf("%d\n",j); return 0; } last=i; } }
相关文章推荐
- bzoj1196: [HNOI2006]公路修建问题(最小生成树+模板题)
- [最小生成树+二分] bzoj1196: [HNOI2006]公路修建问题
- bzoj 1196: [HNOI2006]公路修建问题 (最小生成树)
- bzoj 1196: [HNOI2006]公路修建问题(贪心+最小生成树)
- 【最小生成树】BZOJ 1196: [HNOI2006]公路修建问题
- bzoj1196: [HNOI2006]公路修建问题(最小生成树)
- 【最小生成树】BZOJ 1196: [HNOI2006]公路修建问题
- [BZOJ1196][HNOI2006]公路修建问题(最小生成树)
- BZOJ_1196_[HNOI2006]公路修建问题_kruskal+二分答案
- BZOJ 1196 [HNOI2006]公路修建问题(二分答案+并查集)
- BZOJ 1196 HNOI 2006 公路修建问题 二分答案+并查集
- bzoj1196 [HNOI2006]公路修建问题(二分答案+kruskal/贪心)
- BZOJ 1196 HNOI2006 公路修建问题 二分答案+Kruskal
- 【最小生成树+二分】bzoj1196 公路修建问题
- BZOJ 1196: [HNOI2006]公路修建问题(二分+生成树)
- bzoj 1196: [HNOI2006]公路修建问题 二分+并查集
- BZOJ 1196: [HNOI2006]公路修建问题 Kruskal/二分
- [BZOJ 1196][HNOI 2006]公路修建问题
- BZOJ系列1196《[HNOI2006]公路修建问题》题解
- BZOJ1196: [HNOI2006]公路修建问题