LibreOJ 123 最小生成树 题解

分析:一道Kruskal的裸题,但是时间长了没做,导致sort的比较函数就是写不对。。

并且数据范围比较大,要开long long才能存得下。

#include  <iostream>
#include  <cstdio>
#include  <cstring>
#include  <vector>
#include  <algorithm>
using namespace std;
const int maxn = 200005;
struct Edge {
	int u, v, w;
	Edge() {
	}
	Edge(int u, int v, int w) {
		this->u = u;
		this->v = v;
		this->w = w;
	}
};
vector<Edge> edges;
vector<int> G[maxn];
int n, m, u, v, w, par[maxn];
void Init() {
	edges.clear();
	for(int i = 0; i < maxn; i++) {
		G[i].clear();
	}
}
int find(int u) {
	return (par[u] == u) ? u : (par[u] = find(par[u]));
}
bool comp(const Edge& e1, const Edge& e2) {
	return e1.w < e2.w;
}
void AddEdge(int u, int v, int w) {
	edges.push_back(Edge(u, v, w));
	int size = edges.size();
	G[u].push_back(size - 1);
}
long long kruskal() {
	for(int i = 0; i < maxn; i++) {
		par[i] = i;
	}
	long long ans = 0;
	sort(edges.begin(), edges.end(), comp);
	for(int i = 0; i < edges.size(); i++) {
		int u = find(edges[i].u);
		int v = find(edges[i].v);
		if(u != v) {
			par[u] = v;
			ans += edges[i].w;
		}
	}
	return ans;
}
int main() {
	for(int i = 0; i < maxn; i++) {
		G[i].clear();
	}
	edges.clear();
	scanf("%d%d", &n, &m);
	for(int i = 0; i < m; i++) {
		scanf("%d%d%d", &u, &v, &w);
		AddEdge(u, v, w);
		AddEdge(v, u, w);
	}
	long long ans = kruskal();
	printf("%lld\n", ans);
	return 0;
}


猜你喜欢

转载自blog.csdn.net/wannafly1995/article/details/80811875