比赛 NOIP水题争霸赛 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 最小差异值 最终得分 100
用户昵称 suzihan03 运行时间 2.970 s
代码语言 C++ 内存使用 0.29 MiB
提交时间 2018-02-11 21:15:53
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;

struct Edge {
	int u, v, len;
	inline bool operator<(const Edge & rhs) const { return len < rhs.len; }
};

const int MAXM = 5000, MAXN = 5000, INF = 0x3f3f3f3f;
int N, M, Fa[MAXN+10]; Edge E[MAXM+10];

void Init() {
	int u, v, c;
	scanf("%d%d", &N, &M);
	for(int i=1; i<=M; i++) {
		scanf("%d%d%d", &u, &v, &c);
		E[i] = (Edge) { u, v, c };
	}
	sort(E+1, E+M+1);
}

inline void Reset() {
	for(int i=1; i<=N; i++) Fa[i] = i;
}

int GetFather(int x) {
	return x == Fa[x] ? x : Fa[x] = GetFather(Fa[x]);
}

inline void Union(int x, int y) {
	Fa[GetFather(x)] = GetFather(y);
}

void Work() {
	int Ans = INF, Cnt = 0;
	for(int i=1, j; i<=M; i++) {
		Reset(); Cnt = 0; 
		for(j=i; j<=M; j++) {
			if(GetFather(E[j].u) == GetFather(E[j].v))
				continue;
			++Cnt; Union(E[j].u, E[j].v);
			if(Cnt == N - 1) break;
		}
		if(Cnt == N - 1)
			Ans = min(Ans, E[j].len - E[i].len);
	}
	printf("%d", Ans);
}

int main() {
#ifndef DEBUG
	freopen("dvalue.in", "r", stdin);
	freopen("dvalue.out", "w", stdout);
#endif
	Init(); Work();
}