在本题中,读入一个无向图的邻接矩阵(即数组表示),建立无向图并按照以上描述中的算法建立最小生成树,并输出最小生成树的代价。
输入
输入的第一行包含一个正整数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
prim(加点):
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int map[60][60],book[60],dis[60];
int main()
{
int n;
while(cin>>n)
{
memset(book,0,sizeof(book));
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
cin>>map[i][j];
if(i!=j&&map[i][j]==0)
map[i][j]=0x3f3f3f3f;
}
for(int i=0;i<n;i++)
dis[i]=map[0][i];
book[0]=1;
int count=1,date,sum=0;
while(count<n)
{
count++;
int minn=0x3f3f3f3f;
for(int i=0;i<n;i++)
if(book[i]==0&&dis[i]<minn)
minn=dis[i],date=i;
book[date]=1;
sum+=dis[date];
for(int i=0;i<n;i++)
if(book[i]==0&&dis[i]>map[date][i])
dis[i]=map[date][i];
}
cout<<sum<<endl;
}
return 0;
}