Go: package main

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

func getScanner(fp *os.File) *bufio.Scanner {
	scanner := bufio.NewScanner(fp)
	scanner.Split(bufio.ScanWords)
	scanner.Buffer(make([]byte, 500001), 500000)
	return scanner
}

func getNextString(scanner *bufio.Scanner) string {
	scanner.Scan()
	return scanner.Text()
}

func getNextInt(scanner *bufio.Scanner) int {
	i, _ := strconv.Atoi(getNextString(scanner))
	return i
}

func main() {
	fp := os.Stdin
	if len(os.Args) > 1 {
		fp, _ = os.Open(os.Args[1])
	}

	scanner := getScanner(fp)
	writer := bufio.NewWriter(os.Stdout)

	n := getNextInt(scanner)

	g := make([][]int, n)
	ans := make([][]int, n)

	inf := 1 << 30
	for i := 0; i < n; i++ {
		g[i] = make([]int, n)
		ans[i] = make([]int, n)
		for ii := 0; ii < n; ii++ {
			g[i][ii] = getNextInt(scanner)
			if g[i][ii] == -1 {
				g[i][ii] = inf
			}
			ans[i][ii] = -1
		}
	}

	im := make(IntMap, 1)

	im.increment(1)

	for len(im) < n {
		min := inf
		u := -1
		v := -1
		for i := range im {
			for ii := 0; ii < n; ii++ {
				if im.get(ii) != 0 {
					continue
				}
				if min > g[i][ii] {
					min = g[i][ii]
					u = i
					v = ii
				}
			}
		}
		im.increment(v)
		ans[u][v] = min
		ans[v][u] = min
	}

	sum := 0
	for i := 0; i < n-1; i++ {
		for ii := i + 1; ii < n; ii++ {
			if ans[i][ii] != -1 {
				sum += ans[i][ii]
			}
		}
	}

	fmt.Fprintln(writer, sum)
	writer.Flush()
}

// IntMap ...
type IntMap map[int]int

func (m IntMap) get(key int) int {
	if _, ok := m[key]; ok {
		return m[key]
	}
	return 0
}
func (m IntMap) increment(key int) {
	if _, ok := m[key]; ok == false {
		m[key] = 0
	}
	m[key]++
}

C++: #include <iostream>
using namespace std;
const int MAXn=100;
const int INFTY=1<<21;

int n,M[MAXn][MAXn],col[MAXn],d[MAXn],p[MAXn];

void prim()
{
	for(int i=0;i<n;i++)
	{
		col[i]=0;
		d[i]=INFTY;
	}
	d[0]=0;
	p[0]=-1;
	
	while(1)
	{
		int mincost=INFTY;
		int u;
		for(int i=0;i<n;i++)
		{
			if(col[i]!=2&&d[i]<mincost)
			{
				mincost=d[i];
				u=i;
			}
		}
		if(mincost==INFTY)break;
		col[u]=2;
		for(int v=0;v<n;v++)
		{
			if(col[v]!=2&&M[u][v]!=INFTY)
			{
				if(M[u][v]<d[v])
				{
					d[v]=M[u][v];
					p[v]=u;
					col[v]=1;
				}
			}
		}
	}
	return;
}

int sum()
{
	int sum=0;
	for(int i=0;i<n;i++)if(p[i]!=-1)sum+=M[i][p[i]];
	return sum;
}

int main() {
	cin>>n;
	for(int i=0;i<n;i++)for(int j=0;j<n;j++)
	{
		cin>>M[i][j];
		if(M[i][j]==-1)M[i][j]=INFTY;
	}
	prim();cout<<sum()<<endl;
	return 0;
}

C++: #include <iostream>
#include <set>
#include <vector>
using namespace std;

int V, E, d[105][105], INF = 1e9;

int Prim() {
    int s = 0, c[105], n[105], ans = 0;
    set<int> U;
    for (int i = 1; i < V; i++) U.insert(i);
    bool p[10] = {};

    for (int i = 0; i < V; i++) {
        c[i] = d[s][i];
        n[i] = s;
    }
    vector<pair<int, int>> T;
    while (!U.empty()) {
        int mn = INF, w = -1;
        for (auto& i : U) {
            if (c[i] < mn) {
                mn = c[i];
                w = i;
            }
        }
        U.erase(w);
        T.emplace_back(w, n[w]);
        ans += d[w][n[w]];
        for (auto& i : U) {
            if (d[w][i] < c[i]) {
                c[i] = d[w][i];
                n[i] = w;
            }
        }
    }
    return ans;
}

int main() {
    cin >> V;
    for (int i = 0; i < V; i++) {
        for (int j = 0; j < V; j++) {
            cin >> d[i][j];
            if (d[i][j] == -1) d[i][j] = INF;
        }
    }

    cout << Prim() << endl;
}

C++: #include<iostream>
#include<queue>
#include <utility>
#include <vector>

#define MAX_NUM 10000

using namespace std;

int main(){
	priority_queue<int, vector<int>, less<int> >heap;
	int L,P,N,A[MAX_NUM],B[MAX_NUM],num=0;
	cin>>N>>L>>P;
	for(int i=0;i<N;i++){
		cin>>A[i];
	}
	for(int i=0;i<N;i++){
		cin>>B[i];
	}
	int i=0;
	while(L>P){
		while(A[i]<=P && i<N){
			heap.push(B[i]);
			i++;
		}
		if(heap.empty()==1){
			cout<<-1<<endl;
		}
		P+=heap.top();
		heap.pop();
		num++;
	}
	cout<<num<<endl;
	return 0;
}

C++: #include <iostream>
using namespace std;
static const int MAX =100;
static const int INFTY =(1<<21);
static const int WHITE =0;
static const int GRAY =1;
static const int BLACK =2;

int n, M[MAX][MAX];

int prim(){
  int u,minv;
  int d[MAX],p[MAX],color[MAX];

  for(int i=0;i<n;i++){
    d[i]=INFTY;
    p[i]=-1;
    color[i]=WHITE;
  }
  d[0]=0;

  while(1){
    minv=INFTY;
    u=-1;
    for(int i=0;i<n;i++){
      if(minv>d[i] && color[i] !=BLACK){
        u=i;
        minv=d[i];
      }
    }
    if(u==-1)break;
    color[u]=BLACK;
    for(int v=0;v<n;v++){
      if(color != BLACK && M[u][v]!=INFTY){
        if(d[v]>M[u][v]){
          d[v]=M[u][v];
          p[v]=u;
          color[v]=GRAY;
        }
      }
    }
  }
  int sum=0;
  for(int i=0;i<n;i++){
    if(p[i]!=-1)sum+=M[i][p[i]];
  }
  return sum;
}

int main(){
  cin >> n;

  for(int i=0;i<n;i++){
    for(int j=0;j<n;j++){
    int e; cin >> e;
    M[i][j]= (e==-1)? INFTY:e;
    }
  }

  cout << prim() << endl;
}

C++: #include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

#define MAX_N 100
#define MAX_EDGE_COST 20000
int Graph[MAX_N+1][MAX_N+1];
int n;

int prim(int initial_vertex) {
  bool visited[n+1];
  for(int i=1;i<=n;i++) visited[i] = false;
  vector<int> vertexes;
  vertexes.push_back(initial_vertex);
  visited[initial_vertex] = true;
  int total_edge_cost = 0;
  while(vertexes.size() <= n) {
    // find minimum edge cost in vertexes
    int minimum_edge_cost = MAX_EDGE_COST;
    int next_v;
    for(int i=0;i<vertexes.size();i++) {
      int v = vertexes[i];
      for(int j=1;j<=n;j++) {
        if(!visited[j]) {
          if(Graph[v][j] != -1) {
            if(Graph[v][j] < minimum_edge_cost) {
              minimum_edge_cost = Graph[v][j];
              next_v = j;
            }
          }
        }
      }
    }
    vertexes.push_back(next_v);
    total_edge_cost += minimum_edge_cost;
  }
  return total_edge_cost;
}

int main() {
  scanf("%d",&n);
  for(int i=1;i<=n;i++) {
    for(int j=1;j<=n;j++) {
      scanf("%d ",&Graph[i][j]);
    }
  }
  printf("%d\n",prim(1));
}

C++: #include <iostream>
using namespace std;
static const int MAX=101;
static const int INFTY=(1<<21);
static const int WHITE=0;
static const int GRAY=1;
static const int BLACK=2;

int n,M[MAX][MAX];

int prim(){
    int u,minv;
    int d[MAX],p[MAX],color[MAX];
    for(int i=0;i<n;i++){
        d[i]=INFTY;
        p[i]=-1;
        color[i]=WHITE;
    }
    
    d[0]=0;
    
    while(1){
        minv=INFTY;
        u=-1;
        for(int i=0;i<n;i++){
            if(minv>d[i] && color[i]!=BLACK){
                u=i;
                minv=d[i];
            }
        }
        if(u==-1) break;
        color[u] = BLACK;
        for(int i=0;i<n;i++){
            if(color[i]!=BLACK && M[u][i]!=INFTY){
                if(d[i]>M[u][i]){
                    d[i]=M[u][i];
                    p[i]=u;
                    color[i]=GRAY;
                }
            }
        }
    }
    int sum=0;
    for(int i=0;i<n;i++){
        if(p[i]!=-1) sum += M[i][p[i]];
    }
    
    return sum;
}

int main(){
    cin >> n;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            cin >> M[i][j];
            if(M[i][j]==-1) M[i][j]=INFTY;
        }
    }
    
    cout << prim() << endl;
    
    return 0;
}