题目描述看这里
AC代码:
#include<stdio.h>
#include<string.h>
int N,a,b,c;int k;int max;
int dist[102][102];
int lowcost[102];
int choose[102];
//判断是否所有的点都被联通了
bool Isfinish(){
for(int i=1;i<=N;i++){
if(choose[i]==-1)
return false;
}
return true;
}
//用x更新lowcost数组
void updatelowcost(int x){
for(int i=2;i<=N;i++){ //最开始以城镇1为起始点,1不更新
if(dist[x][i]!=0&&dist[x][i]<lowcost[i])
lowcost[i]=dist[x][i];
}
}
//prim算法,确定最短的边和下一个加入的点
void prim(){
while(!Isfinish()){
int min=999999;
for(int i=1;i<=N;i++){
if(lowcost[i]==0)//代表i这个点已经加入过了
continue;
if(lowcost[i]<min){//min是这一轮的最小值
min=lowcost[i];
k=i; //k是下一个加入的点
}
}
max+=min; //总的花费=各个最小花费的和
lowcost[k]=0;
choose[k]=0; //标记k加入了
updatelowcost(k); //用k更新lowcost
}
}
int main(){
while(scanf("%d",&N)!=EOF&&N){
max=0;
memset(dist,0,sizeof(dist)); //0代表没有通路
memset(choose,-1,sizeof(choose));
memset(lowcost,999999,sizeof(lowcost));
for(int i=1;i<=N*(N-1)/2;i++){
scanf("%d%d%d",&a,&b,&c);
dist[a][b]=c;
dist[b][a]=c;
}
choose[1]=0;//用1号去开始这次算法
lowcost[1]=0;
updatelowcost(1);
prim();
printf("%d\n",max);
}
return 0;
}
主要是注意lowcost数组的更新和choose这个标记数组的更新