Go: package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
	"strconv"
)

var scanner = bufio.NewScanner(os.Stdin)

func nextString() string {
	scanner.Scan()
	return scanner.Text()
}

func nextInt() int {
	n, err := strconv.Atoi(nextString())
	if err != nil {
		fmt.Printf("strconv.Atoi failed: %v\n", err)
	}
	return n
}

type ElementKey int
type Node struct {
	key    ElementKey
	parent *Node
	rank   int
}

func newNode(key ElementKey) *Node {
	node := Node{}
	node.key = key
	node.parent = &node
	node.rank = 0

	return &node
}

func union(x, y *Node) {
	xSet := findSet(x)
	ySet := findSet(y)
	link(xSet, ySet)
}

func link(x, y *Node) {
	if x.rank > y.rank {
		y.parent = x
	} else {
		x.parent = y

		if x.rank == y.rank {
			y.rank++
		}
	}
}

func findSet(x *Node) *Node {
	if x != x.parent {
		x.parent = findSet(x.parent)
	}
	return x.parent
}

func newDisjointSets(nSets int) *DisjointSets {
	sets := DisjointSets{}
	sets.keyToNode = map[ElementKey]*Node{}
	for i := 0; i < nSets; i++ {
		key := ElementKey(i)
		sets.keyToNode[key] = newNode(key)
	}
	return &sets
}

type DisjointSets struct {
	keyToNode map[ElementKey]*Node
}

func (sets *DisjointSets) union(x, y ElementKey) {
	xNode := sets.keyToNode[x]
	yNode := sets.keyToNode[y]
	union(xNode, yNode)
}

func (sets DisjointSets) findSet(x ElementKey) *Node {
	xNode := sets.keyToNode[x]
	return findSet(xNode)
}

type Edge struct {
	i, j   int
	weight int
}

func main() {
	scanner.Split(bufio.ScanWords)

	n := nextInt()
	sets := newDisjointSets(n)
	edges := []Edge{}
	a := make([][]int, n)
	for i := 0; i < n; i++ {
		a[i] = make([]int, n)
		for j := 0; j < n; j++ {
			a[i][j] = nextInt()
			if a[i][j] >= 0 {
				e := Edge{
					i:      i,
					j:      j,
					weight: a[i][j],
				}
				edges = append(edges, e)
			}
		}
	}
	sort.Slice(edges, func(i, j int) bool { return edges[i].weight < edges[j].weight })
	totalWeight := 0
	for _, edge := range edges {
		i := ElementKey(edge.i)
		j := ElementKey(edge.j)
		if sets.findSet(i) != sets.findSet(j) {
			totalWeight += edge.weight
			sets.union(i, j)
		}
	}
	fmt.Println(totalWeight)
}

C++: #include <cstdio>
#include <iostream>
#include <cmath>
#include <ctype.h>
#include <string>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <map>
#include <queue>
#include <utility>
#include <vector>
#include <set>
#include <list>
#include <cstring>
#include <stack>

using namespace std;

#define mod 1000000007

class UF
{
private:
	vector<int> root;

public:
	UF(int n)
	{
		root = vector<int>(n + 1, -1);
	}

	int getroot(int n)
	{
		if(root[n] == -1) return n;
		else return root[n] = getroot(root[n]);
	}

	void add(int x, int y)
	{
		x = getroot(x);
		y = getroot(y);
		if(x == y) return;
		if(x > y) swap(x, y);
		root[y] = x;
		return;
	}
};

int main()
{
	int n;
	cin >> n;
	priority_queue<pair<int, pair<int, int> > > qu;
	for(int i = 0; i < n; i++){
		for(int j = 0; j < n; j++){
			int w;
			cin >> w;
			if(w >= 0){
				qu.push(make_pair(-w, make_pair(i, j)));
			}
		}
	}
	UF uf(n);
	int ans = 0;
	while(!qu.empty()){
		int cost = -(qu.top()).first;
		int x = ((qu.top()).second).first;
		int y = ((qu.top()).second).second;
		qu.pop();
		if(uf.getroot(x) == uf.getroot(y)) continue;
		ans += cost;
		uf.add(x, y);
	}
	cout << ans << endl;
	return 0;
}

C++: #include <iostream>
#include <string>
#include <vector>
#include <cstring>
#include <climits>
#include <algorithm>
#include <map>

using namespace std;

class UnionFind {
public:
    vector<int> parent;
    UnionFind(int n) : parent(n, -1) { }
    void unite(int x, int y) {
        x = root(x), y = root(y);
        if (x != y) {
            if (parent[y] < parent[x]) swap(x, y);
            parent[x] += parent[y];
            parent[y] = x;
        }
    }
    bool find(int x, int y) {
        return root(x) == root(y);
    }
    int root(int x) {
        return parent[x] < 0 ? x : parent[x] = root(parent[x]);
    }
};

int main() {
    int n;
    cin >> n;
    UnionFind uf(n);
    vector<pair<int,pair<int,int> > > E;
    int cost;
    for (int i=0; i<n; ++i) {
        for (int j=0; j<n; ++j) {
            cin >> cost;
            if (0 <= cost) {
                E.push_back(make_pair(cost, make_pair(i, j)));
            }
        }
    }
    sort(E.begin(), E.end());
    int res = 0;
    for (int i=0; i<(int)E.size(); ++i) {
        if ( ! uf.find(E[i].second.first, E[i].second.second)) {
            uf.unite(E[i].second.first, E[i].second.second);
            res += E[i].first;
        }
    }
    cout << res << endl;
    return 0;
}

C++: #include <stdio.h>

int main(){
	int n, G[100][100], tree[100][99] = { 0 };
	scanf("%d", &n);
	for (int i = 0; i < n; i++){
		for (int j = 0; j < n; j++){
			scanf("%d", &G[i][j]);
		}
	}

	int min0 = 2001;
	tree[0][0]++;
	for (int i = 1; i < n; i++){
		if (G[0][i]+1 && G[0][i] < min0){
			min0 = G[0][i];
			tree[0][1] = i;
		}
	}
	tree[tree[0][1]][0]++;

	for (int connected = 2; connected < n; connected++){
		int min = 2001,mink,minl;
		for (int k = 0; k < n; k++){
			if (!tree[k][0]){
				continue;
			}
			for (int l = 0; l < n; l++){
				if (!tree[l][0] && G[k][l] + 1 && G[k][l] < min){
					min = G[k][l];
					mink = k;
					minl = l;
				}
			}
		}
		tree[mink][++tree[mink][0]] = minl;
		tree[minl][++tree[minl][0]] = mink;
	}

	int sum = 0;
	for (int i = 0; i < n; i++){
		for (int j = 0; j < tree[i][0]; j++){
			sum += G[i][tree[i][j + 1]];
		}
	}

	printf("%d\n", sum >> 1);
	return 0;
}

C++: #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define INF 2000000
#define MAX 20000
int m[MAX][MAX],color[MAX],d[MAX],num;
int spaning(){
	for(int i=0;i<num;i++){
		color[i]=0;d[i]=INF;
	}
	d[0]=0;
	int sum=0;
	int min_now=INF;
	while(1){
		int v=-1;
	for(int i=0;i<num;i++){
		if(!color[i]&&(v==-1||d[v]>d[i])){
			v=i;
		}}
		if(v==-1) break;
		sum+=d[v];
		color[v]=1;
	for(int i=0;i<num;i++){
		if(!color[i]){
			d[i]=min(d[i],m[v][i]);
		}
	
	}
	}
	return sum;
}
int main(){
	int a;
	cin>>num;
	for(int i=0;i<num;i++){
		for(int j=0;j<num;j++){
			cin>>a;
			if(a==-1) m[i][j]=INF;
			else m[i][j]=a;
		}
	}
	int s=spaning(); 
	cout<<s<<endl;
}

C++: #include <iostream>
#include <queue>
#include <vector>
#include <utility>
using namespace std;
typedef pair<int,int> Info;
int main(){
        int N;
        cin >> N;
        vector <vector<int> > adjancey(N,vector<int>(N));
        priority_queue<Info, vector<Info>,greater<Info> > descending;
        for(int i=0 ; i<N ; i++ )
                for(int j=0 ; j<N ; j++ )
                        cin >> adjancey[i][j];
        Info wn;
        int now=0,counter=0;
        vector <bool> past(N,false);
        while(true){
                past[now]=true;
                for(int i=0 ; i<N ; i++ ){
                        if(past[i])
                                continue;
                        if(adjancey[now][i]==-1)
                                continue;
                        wn.first=adjancey[now][i];
                        wn.second=i;
                        descending.push(wn);
                }
                int c=0;
                for(int i=0;i<N;i++)
                        c+=past[i];
                if(c==N)break;
                wn=descending.top();descending.pop();
                now=wn.second;
                if(past[now])continue;
                counter+=wn.first;
        }
        cout << counter << endl;
        return 0;
}