prim算法--还是通畅工程

题目描述看这里
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这个标记数组的更新

猜你喜欢

转载自blog.csdn.net/weixin_44617722/article/details/88660443