题目
题目大意
本题题意迷惑性很大,但观察可以发现本题实际上就是求出一个图的最小生成树。题目要求整个网络中向root传输的时间最短,而传输时间就是任意两点间传输的最大时间。所以本题就是求最小生成树问题。
解题思路
最小生成树问题与之前的练习题目十分相似,只不过本题最终结果要求得到的是最小生成树中的最大边权。对于用最小堆完成的Kruskal算法,最后一次弹出的边就是最小生成树中最大边权。
Kruskal求最小生成树问题可以参照之前的说明:
https://blog.csdn.net/weixin_43676449/article/details/105123639
具体代码
#include <iostream>
#include <queue>
#define MAXN 100005
using namespace std;
struct road{
int from;
int to;
int length;
bool operator<(const road& a) const
{
return length > a.length; //小根堆,反号大根堆
}
};
priority_queue<road> a; //自定数据类型优先队列
int fa[MAXN];
int getfa(int n)
{
if(fa[n] != n)
{
fa[n] = getfa(fa[n]);
}
return fa[n];
}
void unity(int x, int y)
{
int f1 = getfa(x);
int f2 = getfa(y);
fa[f1] = f2;
}
int main(int argc, char** argv)
{
for(int i = 0; i < MAXN; i++)
{
fa[i] = i;
}
int n,m,root,cnt = 0,ans = 0;
road temp;
cin >> n >> m >> root;
for(int i = 1; i <= m; i++)
{
cin >> temp.from;
cin >> temp.to;
cin >> temp.length;
a.push(temp);
}
while(cnt < n-1)
{
temp = a.top();
a.pop();
if(getfa(temp.from) != getfa(temp.to))
{
ans = temp.length;
unity(temp.from,temp.to);
cnt++;
}
}
cout << ans;
return 0;
}```