该段代码运行错误,找不到原因,求答。 该段代码使用Kruskal + 并查集,为最小差值生成树。 原题JZOJ 1751. Span。题目如下 https://blog.csdn.net/ypxrain/article/details/73438097
/*
#pragma GCC optimize (3, "Ofast", "inline")
#pragma GCC optimize ("unroll-loops")
#pragma GCC target ("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma GCC optimize ("no-stack-protector")
*/
/*
---------------------------* T I P S *-----------------------------
Date: Jul.19th
Author: uFTvL9(xwzy)
message:
Title: spac.cpp/.in/.out
Score:
Score':
tips: Kruskal + Minimum difference spanning tree(MDST)
optimization algorithm:LCT
-------------------------------------------------------------------
*/
#include <bits/stdc++.h>
using namespace std;
/* Defined constants */
typedef long long int64;
const auto INF = 0x3f3f3f3f;
const auto MINF = 0xc0c0c0c0;
const auto MAX = 1e9;
const auto MIN = -1e9;
const auto MOD = 1e9 + 7;
/* ------------------------------------ */
struct Egnode
{
int from;
int to;
int value;
};
/* Function Heads */
inline int work();
inline int Kruskal(Egnode* Edge, int N);
inline bool cmp(Egnode o1, Egnode o2);
/* ------------------------------------ */
struct IO_Tp {
bool is_digit(const char ch) {
return '0' <= ch && ch <= '9';
}
} FI;
/* classes, templates and namespaces */
class union_find_set {
private:
static const int unionFindSetSize = 200000;
int f[unionFindSetSize];
virtual inline int find(int x) {
return (f[x] == x)? x : f[x] = find(f[x]);
}
public:
virtual inline void initialize(int n) {
for (int i = 0; i < n; i++) {
f[i] = i;
}
}
virtual inline void merge(int x, int y) {
f[find(x)] = find(y);
}
virtual inline bool judge(int x, int y) {
return find(x) == find(y);
}
}union_find_set;
/* ------------------------------------ */
int main(void) {
freopen("span.in", "r", stdin);
freopen("span.out", "w", stdout);
return work();
}
inline int work() {
ios::sync_with_stdio(false);
std::cin.tie(0);
short T; cin >> T;
int res;
while(T--) {
int N, M;
cin >> N >> M;
Egnode Edgeset[M];
for(int i = 0; i < M; i++) {
cin >> Edgeset[i].from;
cin >> Edgeset[i].to;
cin >> Edgeset[i].value;
}
res = Kruskal(Edgeset, M);
}
cout << res;
return 0;
}
/* functions */
inline bool cmp(Egnode o1, Egnode o2) {
return o1.value < o2.value;
}
inline int Kruskal(Egnode* Edge, int N) {
union_find_set.initialize(N);
sort(Edge, Edge + N, cmp);
int MDif = 0;
int MaxEdg = INF;
int MinEdg = MINF;
int DifRes = -1;
int EDGE = 0;
for(int j = 0; j < N; j++) {
for(int i = 0;; i++) {
if(EDGE == N - 1) {
DifRes = MaxEdg - MinEdg;
break;
}
if(!union_find_set.judge(Edge[i].from, Edge[i].to)) {
union_find_set.merge(Edge[i].from, Edge[i].to);
EDGE++;
MaxEdg = max(MaxEdg, Edge[i].value);
MinEdg = min(MinEdg, Edge[i].value);
}
}
MDif = min(MDif, DifRes);
}
return MDif;
}
/* ------------------------------------ */