#include<iostream>
#include <stdio.h>
#include <memory.h>
#include <queue>
using namespace std;
const int IN = 1000000 ;
int G[105][105];
int path[105][105];
int M,N;
int locost[105];
int parent[105];
int FindMin();
int cost;
void Prime()
{
for(int i=1; i<=N; i++)
{
locost[i] = G[1][i];
parent[i] = 1;
}
locost[1] = 0;
parent[1] = -1;
for(int i=1; i<N; i++)
{
int k = FindMin();
if(k)
{
cost+=locost[k];
locost[k] = 0;//把k归入最小生成树
for(int j=1; j<=N; j++)
{
if(locost[j] && G[k][j]<=locost[j])//调整距离
{
locost[j] = G[k][j];
parent[j] = k;
}
}
}
else
cout<<"error"<<endl;
}
}
int FindMin()
{
int Min = IN,k=0;
for(int i=1; i<=N; i++)
if(locost[i]&&locost[i]<Min)
{
Min = locost[i];
k=i;
}
return k;
}
int main()
{
cin >> M >>N;
for(int i=1; i<=N; i++)
for(int j=1; j<=N; j++)
G[i][j] = IN;
while(M--)
{
int s,d,l;
cin >> s >> d >> l;
G[s][d] = l;
G[d][s] = l;
}
cost = 0;
Prime();
cout<<cost<<endl;
return 0;
}
原理是每次把权重最小的边归入最小生成树,然后调整距离。