AC

 •  10天前


#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1000010;
const int INF = 1e9 + 7;

struct Edge {
	int u, v, w;
	bool operator<(const Edge &other) const {
		return w < other.w;
	}
} edge[MAXN];

int parent[MAXN], h[MAXN];
int n, m;

int find(int x) {
	if (parent[x] != x) {
		parent[x] = find(parent[x]);
	}
	return parent[x];
}

void unite(int x, int y) {
	int rootx = find(x);
	int rooty = find(y);
	if (rootx == rooty)
		return;

	if (h[rootx] < h[rooty]) {
		parent[rootx] = rooty;
	} else {
		parent[rooty] = rootx;
		if (h[rootx] == h[rooty]) {
			h[rootx]++;
		}
	}
}


void init() {
	for (int i = 1; i <= n; i++) {
		parent[i] = i;
		h[i] = 0;
	}
}

int main() {
	cin >> n >> m;
	for (int i = 0; i < m; i++) {
		int u, v, w;
		cin >> u >> v >> w;

		if (u != v) {
			edge[i] = {u, v, w};
		} else {
			edge[i] = {u, v, INF};
		}
	}

	sort(edge, edge + m);

	int minDiff = INF;


	for (int i = 0; i < m; i++) {
		if (edge[i].w == INF)
			continue;

		init();
		int maxW = -INF;
		int tot = 0;

		for (int j = i; j < m; j++) {
			if (edge[j].w == INF)
				continue;

			int u = edge[j].u;
			int v = edge[j].v;
			int w = edge[j].w;

			if (find(u) != find(v)) {
				unite(u, v);
				maxW = max(maxW, w);
				tot++;
				if (tot == n - 1) {
					break;
				}
			}
		}

		if (tot == n - 1) {
			minDiff = min(minDiff, maxW - edge[i].w);
		}
	}

	cout << minDiff << endl;

	return 0;
}


评论:

请先登录,才能进行评论