题目大意
题目链接
给定好多点之间的距离,要求任意两点可以到达,求最小生成树的最长路径。
思路
模板题,给个之前总结的图论相关的常用算法,我最喜欢并查集,所以用了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;
}
}