#include<iostream>
using namespace std;
int magraph[1005][1005];
#define INF 1000
#define MaxSize 1000
class PrimAlgo
{
int start,n;
int *lowcost;
int *closet;
public:
PrimAlgo(int N,int init)
{
start=init,n=N;
lowcost=new int[MaxSize];
closet=new int[MaxSize];
}
int prim()
{
int i,j,minid,min,len=1;
int sum=0;
for(i=1;i<=n;i++)
{
if(i!=start){
lowcost[i]=magraph[start][i];
closet[i]=start;
}
}
// for(i=1;i<=n;i++)
// cout<<lowcost[i]<<endl;
lowcost[start]=0; //起点到自己的权值设为0
for(i=1;i<n;i++)
{
min=INF;
// minid=0;
for(j=1;j<=n;j++)
{
if(lowcost[j]!=0 && lowcost[j]<min){
min=lowcost[j];
minid=j;
}
}
// if(min=INF)
// return -1;
if(min!=INF) //可能找不到通路
{
sum+=min;
// cout<<closet[minid]<<"->"<<minid<<endl;
lowcost[minid]=0;
len++;
for(j=1;j<=n;j++)
{
//新加入点后寻找更短路径
//只需判断新加入的点与其他点是否存在权值比之前小的路径
if(lowcost[j]>magraph[minid][j])
{
lowcost[j]=magraph[minid][j];
closet[j]=minid;
}
}
}
}
// cout<<len;
if(len==n)
return sum;
else
return -1;
}
};
int main()
{
int i,j,k,N,M;
cin>>N>>M;
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
magraph[i][j]=INF; //可能两村落间无通路,初始设置无穷大
for(i=1;i<=M;i++)
{
cin>>j>>k;
cin>>magraph[j][k];
magraph[k][j]=magraph[j][k]; //无向图双向相等
}
// for(i=1;i<=N;i++)
// for(j=1;j<=N;j++)
// cout<<i<<" "<<j<<" "<<magraph[i][j]<<endl;
PrimAlgo p(N,1);
cout<<p.prim();
}
02-07
2430
02-18
1346