#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAXN 1005
#define INF 1e9
int G[MAXN][MAXN],n;
int cost[MAXN]; //元素为-1,表示已访问;为0表示成本为0(起始点)
void Initialize(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
G[i][j]=INF;
}
cost[i]=INF;
}
}
int Prime(){
int k=0;
cost[1]=0; //起始点成本为0
for(int i=1;i<=n;i++){
int min=INF,v=-1;
for(int j=1;j<=n;j++){
if(cost[j]!=-1&&cost[j]<min){ //未加入生成树且成本最小
min=cost[j];
v=j;
}
}
if(v==-1) //不连通
return -1;
k+=cost[v];
cost[v]=-1; //表示已加入生成树
for(int j=1;j<=n;j++){ //修改未加入生成树结点到生成树集合的最短距离
if(cost[j]!=0&&G[v][j]<cost[j]){
cost[j]=G[v][j];
}
}
}
return k;
}
int main(){
int m,a,b,c;
cin>>n>>m;
Initialize();
while(m--){
cin>>a>>b>>c;
G[a][b]=G[b][a]=c;
}
int k=Prime();
cout<<k<<endl;
return 0;
}
7-10 公路村村通 (30 分)【最小生成树Prim算法】
最新推荐文章于 2022-11-17 20:57:59 发布