题目来源:BZOJ 1083
思路:最小瓶颈生成树(权值最大的边在所有生成树中最小)
有如下定理:无向图的最小生成树一定是瓶颈生成树,但瓶颈生成树不一定最小生成树。(分别用反证法和举反例即可)
有了这个定理,直接用Kruskal求MST即可。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
using namespace std;
const int MAXN=45000+5;
struct krus
{
int src;
int dest;
int len;
}temp[MAXN];
bool cmp(krus a,krus b)
{
return a.len<b.len;
}
int pre[305];
int findRoot(int x)
{
while(x!=pre[x])
x=pre[x];
return x;
}
int main()
{
int n,m,i,cnt=0,ans=0;
scanf("%d %d",&n,&m);
for(i=1;i<=n;++i)
pre[i]=i;
for(i=0;i<m;++i)
scanf("%d %d %d",&temp[i].src,&temp[i].dest,&temp[i].len);
sort(temp,temp+m,cmp);
for(i=0;i<m;++i)
{
if(findRoot(temp[i].src)!=findRoot(temp[i].dest))
{
pre[findRoot(temp[i].dest)]=findRoot(temp[i].src);
cnt++;
}
if(cnt==n-1)
{
ans=temp[i].len;
break;
}
}
printf("%d %d\n",cnt,ans);
return 0;
}