站外题求助
  • 板块学术版
  • 楼主uFTvL9
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/7/19 17:13
  • 上次更新2023/10/27 19:30:43
查看原帖
站外题求助
411963
uFTvL9楼主2022/7/19 17:13

该段代码运行错误,找不到原因,求答。 该段代码使用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;
}
/* ------------------------------------ */

2022/7/19 17:13
加载中...