您的位置:首页 > 其它

BZOJ 1083 [SCOI2005]繁忙的都市

2013-01-18 23:03 260 查看
这个经典的设问形式你难道没有心动么?

这不是在提示你二分么?

二分边权,然后并查集判定连通性,因为连通了一定会有最小生成树

奥,第一问的答案是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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: