csp 201812-4 题目总结回顾

题目

题目链接

题目大意

本题题意迷惑性很大,但观察可以发现本题实际上就是求出一个图的最小生成树。题目要求整个网络中向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;
}```

原创文章 46 获赞 1 访问量 1509

猜你喜欢

转载自blog.csdn.net/weixin_43676449/article/details/105125341