2485:Highways:最小生成树模板题

题目大意

题目链接
给定好多点之间的距离,要求任意两点可以到达,求最小生成树的最长路径。

思路

模板题,给个之前总结的图论相关的常用算法,我最喜欢并查集,所以用了Kruskal。

#include<iostream>
#include<string.h>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;

#define MAX 505
#define ll int

struct edge {
	ll from, to, dis;
	edge(ll a = 0, ll b = 0, ll c = 0) { from = a, to = b, dis = c; }
};

bool cmp(edge e1, edge e2) {
	return e1.dis < e2.dis;
}

vector<edge> v;
ll kind[MAX];
ll find(ll a) {
	if (a == kind[a])return a;
	else return kind[a] = find(kind[a]);
}

void unite(ll a, ll b) {
	kind[find(b)] = kind[find(a)];
}

int main() {
	int L;
	cin >> L;
	while (L--) {
		ll n, d; cin >> n; v.clear();
		for (int i = 0; i <= n; i++)kind[i] = i;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				scanf_s("%d", &d);
				if (i == j)continue;
				v.push_back(edge(i, j, d));
			}
		}
		sort(v.begin(), v.end(), cmp);
		ll cnt = 0, maxx = 0;
		for (unsigned i = 0; i < v.size() && cnt != n - 1; i++) {
			edge e = v[i];
			if (find(e.from) != find(e.to)) {
				unite(e.from, e.to); maxx = e.dis; cnt++;
			}
		}
		cout << maxx << endl;
	}
}
发布了211 篇原创文章 · 获赞 14 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/csyifanZhang/article/details/105332318