题目
答案
#include<iostream>
#include<cstring>
using namespace std;
#define inf 0x3f3f3f3f
int graph[1001][1001],n,m;
int vis[1001],dis[1001],sum=0;
void init()//初始化赋值
{
memset(graph,inf,sizeof(graph));
memset(vis,1,sizeof(vis));
cin>>n>>m;
for(int i=0;i<m;i++)
{
int x,y,z;
cin>>x>>y>>z;
graph[x][y]=graph[y][x]=z;
}
}
int Prim(int root)
{
for(int i=1;i<=n;i++)//初始化dis(距离)数组
{
if(i==root) dis[i]=0;
else dis[i]=graph[root][i];
}
vis[root]=0;
int min,pos,cnt=n-1;
//cnt为遍历次数,min为最小值,pos为最小值所在位置
//注意如果已经将root视为遍历过的,那么cnt就要-1
while(cnt--)
{
min=inf;
pos=-1;
for(int i=1;i<=n;i++)//寻找dis的最小值及下标
{
if(vis[i]&&dis[i]<min)
{
min=dis[i];
pos=i;
}
}
if(pos==-1) return -1;
//没有符合要求的点
sum+=min;
vis[pos]= 0;
for(int i=1;i<=n;i++)//更新dis
{
if(vis[i]&&graph[pos][i]<dis[i])
{
dis[i]=graph[pos][i];
}
}
}
return sum;
}
int main()
{
init();
cout<<Prim(1);
}
注意
注意不连通的情况