输入
输入的第一行包含一个正整数n,表示图中共有n个顶点。其中n不超过50。
以后的n行中每行有n个用空格隔开的整数,对于第i行的第j个整数,如果不为0,则表示第i个顶点和第j个顶点有直接连接且代价为相应的值,0表示没有直接连接。当i和j相等的时候,保证对应的整数为0。
输入保证邻接矩阵为对称矩阵,即输入的图一定是无向图,且保证图中只有一个连通分量。
输出
只有一个整数,即最小生成树的总代价。请注意行尾输出换行。
样例输入
4
0 2 4 0
2 0 3 5
4 3 0 1
0 5 1 0
样例输出
6
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define INF 1000000
using namespace std;
const int maxn = 55;
int n;
int G[maxn][maxn];
int prim(int v0){
int lowcost[n];
int min;
int i,j,k,sum = 0;
int visited[n];// visited[i]=0,说明已加入到生成树
memset(visited,0,sizeof(visited));
for(i =0;i<n;i++){
lowcost[i] = INF;
}
lowcost[0]=0;
while(1){
int v=-1;
for(i = 0;i<n;i++){
if(!visited[i]&&(v==-1||lowcost[i] < lowcost[v])){
v = i;
}
}
if(v==-1)break;
visited[v] = 1;
sum += lowcost[v];
for(j = 0;j<n;j++){
if(G[v][j]<lowcost[j]&&G[v][j]!=0)
lowcost[j] = G[v][j];
}
}
return sum;
}
int main(){
int sum = 0;
cin>>n;
for(int i = 0;i<n;i++)
for(int j = 0;j<n;j++)
cin>>G[i][j];
cout<<prim(0)<<endl;
return 0;
}