给出n个点,并给出m对点和它们之间的距离
让你输出所必须的所有边中最长边的长度以及每条边的端点和长度
最小生成树记录路径即可
代码如下:
#include <cstdio>
#include <iostream>
#include <algorithm>
#define MAXN 40010
#define LL long long
using namespace std;
int p[MAXN], u[MAXN], v[MAXN], w[MAXN], r[MAXN];
int ansu[MAXN], ansv[MAXN];
int m, n, cnt, answ, res;
int find(int x) {
return p[x]==x ? x : p[x] = find(p[x]);
}
bool cmp(int i, int j) {
return w[i]<w[j];
}
void Kruskal() {
int minedge = 2000000;
int i, e, x, y;
res = 0;
answ = 0;
for(i=1; i<=n; ++i)
p[i] = i;
for(i=0; i<cnt; ++i)
r[i] = i;
sort(r, r+cnt, cmp);
for(i=0; i<cnt; ++i) {
e = r[i];
x = find(u[e]);
y = find(v[e]);
if(x != y) {
p[x] = y;
ansu[res] = u[e];
ansv[res] = v[e];
answ = max(answ, w[e]);
res++;
}
}
}
int main(void) {
int i;
while(cin >> n >> m) {
for(cnt=0; cnt<m; ++cnt) {
scanf("%d%d%d", &u[cnt], &v[cnt], &w[cnt]);
}
Kruskal();
cout << answ << endl;
cout << res << endl;
for(i=0; i<res; ++i)
cout << ansu[i] << " " << ansv[i] << endl;
}
return 0;
}