BZOJ 1083 [SCOI2005]繁忙的都市
2013-01-18 23:03
260 查看
这个经典的设问形式你难道没有心动么?
这不是在提示你二分么?
二分边权,然后并查集判定连通性,因为连通了一定会有最小生成树
奥,第一问的答案是n-1应该没问题吧,
View Code
这不是在提示你二分么?
二分边权,然后并查集判定连通性,因为连通了一定会有最小生成树
奥,第一问的答案是n-1应该没问题吧,
View Code
#include <iostream> #include <cstring> #include <cstdlib> #include <algorithm> #include <cstdio> #define N 1000 #define M 100000 using namespace std; struct EG { int a,b,c; }eg[M]; int fa ,n,m,ans; inline bool cmp(const EG &a,const EG &b) { return a.c<b.c; } inline int findfa(int x) { if(fa[x]!=x) fa[x]=findfa(fa[x]); return fa[x]; } inline void read() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) scanf("%d%d%d",&eg[i].a,&eg[i].b,&eg[i].c); } inline bool check(int len) { for(int i=1;i<=n;i++) fa[i]=i; for(int i=1;i<=m;i++) if(eg[i].c<=len) { if(findfa(eg[i].a)!=findfa(eg[i].b)) fa[findfa(eg[i].a)]=findfa(eg[i].b); } for(int i=2;i<=n;i++) if(findfa(i)!=findfa(1)) return false; return true; } inline void go() { sort(eg+1,eg+1+m,cmp); int l=1,r=m,mid; while(l<=r) { mid=(l+r)>>1; if(check(eg[mid].c)) ans=eg[mid].c,r=mid-1; else l=mid+1; } printf("%d %d\n",n-1,ans); } int main() { read(); go(); return 0; }
相关文章推荐
- Bzoj1083 1083: [SCOI2005]繁忙的都市【MST】
- BZOJ 1083: [SCOI2005]繁忙的都市
- bzoj1083: [SCOI2005]繁忙的都市
- 【bzoj1083】【SCOI2005】繁忙的都市
- bzoj 1083: [SCOI2005]繁忙的都市 最小生成树
- bzoj 1083: [SCOI2005]繁忙的都市
- bzoj1083[SCOI2005]繁忙的都市
- [bzoj1083][SCOI2005]繁忙的都市【MST】
- 【BZOJ】1083: [SCOI2005]繁忙的都市 二分+并查集
- 【最小瓶颈生成树】【最小生成树】【kruscal】bzoj1083 [SCOI2005]繁忙的都市
- bzoj1083[SCOI2005]繁忙的都市
- 8.4 bzoj1083 [SCOI2005]繁忙的都市
- bzoj1083 [SCOI2005]繁忙的都市
- BZOJ 1083: [SCOI2005]繁忙的都市 kruskal
- BZOJ 1083: [SCOI2005]繁忙的都市 kruskal
- bzoj1083 [SCOI2005]繁忙的都市(kruskal裸题)
- BZOJ 1083: [SCOI2005]繁忙的都市 最小瓶颈生成树Kruskal
- [BZOJ1083]SCOI2005繁忙的都市|最小生成树
- [BZOJ1083][SCOI2005]繁忙的都市
- bzoj 1083: [SCOI2005]繁忙的都市 并查集