程序输入:n为n组测试数组
v为v个对象,e为接下来将输入e组关系
例如:
输入为:
1(一组测试数据)
4 6(4个对象(为1 2 3 4),接下来将有6组关系)
1 2 10 (1与2之间的权值为10)
2 3 10
3 1 10
1 4 1
2 4 1
3 4 1
输出为:
3(为能够连接所有对象的最小权值和)
程序:
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
#define MaxInt 0x3f3f3f3f
void prim(int** map,int& result,int n)
{
int* visited=new int[n+1];//已访问区
int *low=new int[n+1];//小权值数组
int pos,min;
memset(visited,0,sizeof(int)*(n+1));//初始化为0
memset(low,MaxInt,sizeof(int)*(n+1));//初始化为极大值
visited[1]=1;pos=1;
result=0;
for(int i=1;i<=n;i++)
low[i]=map[1][i];
for(int i=1;i<n;i++)
{
min=MaxInt;
for(int j=1;j<=n;j++)
{
if(low[j]<min&&visited[j]==0)
{min=low[j];
pos=j;}
}
result=result+min;
visited[pos]=1;
for(int j=1;j<=n;j++)
{
if(visited[j]==0&&low[j]>map[pos][j])
low[j]=map[pos][j];
}
}
}
int main()
{
int n;
while(cin>>n)
{
int v,e;
cin>>v>>e;
int **map=new int* [v+1];
//邻接矩阵初始化为一个极大值
for(int i=0;i<v+1;i++)
{ map[i]=new int[v+1];
memset(map[i],MaxInt,sizeof(int)*(v+1));}
//邻接矩阵初始化
for(int i=0;i<e;i++)
{
int m,n,tmp;
cin>>m>>n>>tmp;
map[m][n]=tmp;
map[n][m]=tmp;
}
int result=0;
//调用最小生成树prim算法
prim(map,result,v);
cout<<result<<endl;
}
}