BZOJ 1083 繁忙的都市

Posted on 2016-02-28 18:59  ziliuziliu  阅读(101)  评论(0编辑  收藏  举报

古人曰:最小生成树一定是一颗最小瓶颈生成树而最小瓶颈生成树不一定是一棵最小生成树。

然后写个最小生成树就可以了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxv 350
#define maxe 200050
using namespace std;
struct edge
{
int u,v,w;
}e[maxe];
int g[maxv],n,m,a,b,c;
int father[maxv],ans1=0,ans2=0;
bool cmp(edge x,edge y)
{
return x.w<y.w;
}
int find(int x)
{
if (x!=father[x])
father[x]=find(father[x]);
return father[x];
}
void kruskal()
{
for (int i=1;i<=m;i++)
{
int u=e[i].u,v=e[i].v;
int r1=find(u),r2=find(v);
if (r1!=r2)
{
father[r1]=r2;
ans1++;
ans2=max(ans2,e[i].w);
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++)
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
for (int i=1;i<=n;i++)
father[i]=i;
sort(e+1,e+m+1,cmp);
kruskal();
printf("%d %d\n",ans1,ans2);
return 0;
}