zoukankan      html  css  js  c++  java
  • go最小生成树

    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
    */
    

      

  • 相关阅读:
    linux 首次登陆与线上求助
    003生信人必练
    计算器概论
    01 git 概念
    01 基因组学基本感念
    Python 函数习题
    Python字符编码详解,str,bytes
    python class
    [Leetcode]287. Find the Duplicate Number
    深度解析Word2vec
  • 原文地址:https://www.cnblogs.com/yuanweidao/p/15140619.html
Copyright © 2011-2022 走看看