package main
import (
"fmt"
"sort"
)
var (
n, m int //n为点数 m为边数
edges []Edge
pre []int
)
// Edge 记录边
type Edge struct {
from, to int
val int
}
type byVal []Edge
func (b byVal) Len() int {
return len(b)
}
func (b byVal) Swap(i, j int) {
b[i], b[j] = b[j], b[i]
}
func (b byVal) Less(i, j int) bool {
return b[i].val < b[j].val
}
func find(x int) int {
if pre[x] == x {
return x
} else {
root := find(pre[x])
pre[x] = root
return pre[x]
}
}
func main() {
fmt.Scanf("%d %d", &n, &m)
pre = make([]int, n)
for i := 0; i < n; i++ {
pre[i] = i
}
edges = make([]Edge, m)
for i := 0; i < m; i++ {
var a, b, c int
fmt.Scanf("%d %d %d", &a, &b, &c)
a--
b--
edges[i].from = a
edges[i].to = b
edges[i].val = c
}
sort.Sort(byVal(edges))
//fmt.Println(edges)
res := 0
for i := 0; i < m; i++ {
from := edges[i].from
to := edges[i].to
anFrom := find(from)
anTo := find(to)
if anFrom != anTo {
res += edges[i].val
pre[anTo] = anFrom
}
}
an0 := find(0)
for i := 1; i < n; i++ {
if find(i) != an0 {
res = -1
break
}
}
fmt.Println(res)
}
/*
4 3
1 2 1
1 3 10
2 3 3
5 6
1 2 3
2 1 5
1 3 2
4 2 6
4 5 1
5 3 2
*/
原文:https://www.cnblogs.com/yuanweidao/p/15140619.html