最小生成树(prim)

在本题中,读入一个无向图的邻接矩阵(即数组表示),建立无向图并按照以上描述中的算法建立最小生成树,并输出最小生成树的代价。

输入
输入的第一行包含一个正整数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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43540515/article/details/92073361
今日推荐