分析:一道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;
}