题目来源: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;
}
本文介绍了一种利用Kruskal算法求解最小瓶颈生成树(Minimum Bottleneck Spanning Tree)的方法。通过给出具体实现代码,阐述了如何寻找无向图中最大边权最小的生成树,并提供了一个实例演示。
&spm=1001.2101.3001.5002&articleId=72514982&d=1&t=3&u=0ccccb61835243f082c2a8664bdf9ce2)
148

被折叠的 条评论
为什么被折叠?



