For a given weighted graph $G = (V, E)$, find the minimum spanning tree (MST) of $G$ and print total weight of edges belong to the MST.
Input
In the first line, an integer $n$ denoting the number of vertices in $G$ is given. In the following $n$ lines, a $n \times n$ adjacency matrix $A$ which represents $G$ is given. $a_{ij}$ denotes the weight of edge connecting vertex $i$ and vertex $j$. If there is no edge between $i$ and $j$, $a_{ij}$ is given by -1.
Output
Print the total weight of the minimum spanning tree of $G$.
Constraints
- $1 \leq n \leq 100$
- $0 \leq a_{ij} \leq 2,000$ (if $a_{ij} \neq -1$)
- $a_{ij} = a_{ji}$
- $G$ is a connected graph
Sample Input 1
5 -1 2 3 1 -1 2 -1 -1 4 -1 3 -1 -1 1 1 1 4 1 -1 3 -1 -1 1 3 -1
Sample Output 1
5
Reference
Introduction to Algorithms, Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. The MIT Press.
#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const int maxn=101;
const int inf=0x3f3f3f;
int n;
int e[maxn][maxn];
int b[maxn];//权值最小的边权
int p[maxn];//标记v父亲结点
int vis[maxn];//访问状态
int prim()
{
memset(vis,0,sizeof(vis));
memset(p,-1,sizeof(p));
for(int i=0; i<n; i++)
b[i]=inf;
b[0]=0;//选0为起点
while(1)
{
int v=-1;
int ans=inf;
for(int i=0; i<n; i++)
{
if(!vis[i]&&ans>b[i])
{
v=i;
ans=b[i];
}
}
if(v==-1)
break;
vis[v]=1;
for(int i=0; i<n; i++)
{
if(!vis[i]&&b[i]>e[v][i]&&e[v][i]!=inf)
{
b[i]=e[v][i];
p[i]=v;
}
}
}
int ans=0;
for(int i=0; i<n; i++)
{
if(p[i]!=-1)
ans+=e[i][p[i]];
}
return ans;
}
int main()
{
scanf("%d",&n);
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
{
int a;
cin>>a;
if(a!=-1)
e[i][j]=a;
else e[i][j]=inf;
}
printf("%d\n",prim());
return 0;
}