数据中心
sample input:
4
5
1
1 2 3
1 3 4
1 4 5
2 3 8
3 4 2
sample output:
4
思路:
- 输入的数据构成一张图,由于题目中root节点只接受数据其他的节点都进行数据的传输,所以我们可以认为root节点就是树结构的根节点,由此可以构成一棵生成树
- 瓶颈生成树就是树上最大边权值在所有生成树中最小,对于无向图来说,最小生成树一定是最小瓶颈树,但是最小瓶颈树不一定是最小生成树
- 使用kruskal算法来求无向图的最小瓶颈生成树
- 在本题中考虑所有数据都是同时传输的,即树中的最大边权值就是传输需要的时间,即输出最小生成树中的最大边
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=100001;
int f[N];
struct edge
{
int u;
int v;
int w;
}e[N];
bool cmp(const edge& a,const edge& b)
{
if(a.w!=b.w)
return a.w<b.w;
}
int find(int x)
{
if(x!=f[x])
f[x]=find(f[x]);
return f[x];
}
void unite(int a,int b)
{
int tempa=find(a);
int tempb=find(b);
f[tempa]=tempb;
}
int main()
{
int ans=-1;
int n,m,r;
int edgenum=0;
scanf("%d%d%d",&n,&m,&r);
for(int i=0;i<m;i++)
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
for(int i=0;i<n;i++)
f[i]=i;
sort(e,e+m,cmp);
for(int i=0;i<m;i++)
{
if(find(e[i].u)!=find(e[i].v))
{
unite(e[i].u,e[i].v);
ans=max(ans,e[i].w);
edgenum++;
}
if(edgenum==n-1)
{
printf("%d\n",ans);
break;
}
}
return 0;
}