#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
struct node
{
int u;
int v;
int w;
}q[11234];
int a[110];
int d[110][110];
bool cmp(struct node a, struct node b)
{
return a.w < b.w;
}
int f(int x)
{
while(x != a[x]){
x = a[x];
}
return x;
}
int mer(int x, int y)
{
int f1, f2;
f1 = f(x);
f2 = f(y);
if(f1 != f2){
a[f1] = f2;
return 1;
}else {
return 0;
}
}
int main()
{
int n;
int cnt;
while(~scanf("%d", &n)){
int i, j;
for(i =1;i <= n;i++){
a[i] = i;
}
for(i = 1;i <= n;i++){
for(j = 1;j <= n;j++){
scanf("%d", &d[i][j]);
}
}
cnt = 0;
for(i =1;i <= n;i++){
for(j =i+1;j <= n;j++){
q[cnt].u = i;
q[cnt].v = j;
q[cnt].w= d[i][j];
cnt++;
}
}
sort(q,q+cnt,cmp);
int sum = 0;
int cou = 0;
for( i =0;i < cnt;i++){
if(mer(q[i].u,q[i].v)){
sum += q[i].w;
cou++;
}
if(cou == n-1){
break;
}
}
printf("%d\n", sum);
}
return 0;
}
Prim算法
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#define inf 0x3f3f3f3f
using namespace std;
int dis[150];
int book[150];
int a[150][150];
int main()
{
int n;
int i, j, k;
while(cin >> n){
memset(a,0,sizeof(a));
memset(dis,0,sizeof(dis));
memset(book,0,sizeof(book));
for(i = 1;i <= n;i++){
for(j = 1;j <=n;j++){
cin >> a[i][j];
}
}
for(i =1;i <= n;i++){
dis[i] = a[1][i];
}
book[1] = 1;
int cnt = 1;
int sum = 0;
int min;
while(cnt < n){
min = inf;
for(i = 1;i <= n;i++){
if(book[i] == 0 && dis[i] < min){
min = dis[i];
j = i;
}
}
sum += min;
book[j] = 1;
cnt++;
for(k = 1;k <= n;k++){
if(book[k] == 0 && dis[k] > a[j][k]){
dis[k] = a[j][k];
}
}
}
cout << sum << endl;
}
return 0;
}