Sample input to sample
4
0 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0 Sample outputs sample output
Prim Algorithm
/* Author: thmyl
title: p1078 minimum Spanning Tree
*//
adjacency matrix
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n,map[110][110],ans,dis[110];
BOOL vis[110];
void Prim () {
memset (dis,127/3,sizeof (dis));
dis[1]=0;
for (int i=1;i<=n;i++) {
int k=0;
for (int j=1;j<=n;j++) {
if (!vis[j]&& (Dis[j]<dis[k])) {
k=j;
}
}
ANS+=DIS[K];
Vis[k]=1;
for (int j=1;j<=n;j++) {
if (!vis[j])
dis[j]=min (Dis[j],map[k][j]);
}}} int main () {
memset (map,127/3,sizeof (map));
scanf ("%d", &n);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
scanf ("%d", &map[i][j]);
Prim ();
printf ("%d", ans);
Adjacency Matrix
#include <iostream> #include <cstdio> #include <cstring> using namespace std;
int n,num,head[220],ans,dis[110];
BOOL vis[110]; struct node{int to,v,pre;}
E[22000];
void Insert (int from,int to,int v) {E[++num].pre=head[from];
E[num].to=to;
E[num].v=v;
Head[from]=num;
} void Prim () {memset (dis,127/3,sizeof (dis));
dis[1]=0;
for (int i=1;i<=n;i++) {int minn=0x7fffffff,k=0;
for (int j=1;j<=n;j++) {if (!vis[j]&&dis[j]<minn) {minn=dis[j];
K=j;
}} if (MINN==0X7FFFFFFF) break;
Vis[k]=1;
for (int j=head[k];j;j=e[j].pre) {int f=e[j].to;
if (!vis[f]) dis[f]=min (DIS[F],E[J].V);
}} for (int i=1;i<=n;i++) ans+=dis[i];
} int main () {scanf ("%d", &n);
for (int i=1;i<=n;i++) {for (int j=1;j<=n;j++) {int x;scanf ("%d", &x); if (i!=j) Insert (I,J,X);
}} Prim ();
printf ("%d", ans); }Edge table