Prim算法和Dijkstra算法(C语言)

Prim算法

void Prim(int start){//从start顶点开始
	int i,j,k;
	int min,sweight[max];//sweight数组标记是否在最小生成树中,为0,则是
	for(i=0;i<max;i++){
		sweight[i]=weight[start][i];//初始化
		edge[i]=start;//标记边(start,i)在最小生成树中
	}
	sweight[start]=0;//标记start顶点已经在最小生成树中
	for(i=0;i<max-1;i++){//max-1次循环,每次循环找到一个顶点
		min=infinity;
		for(j=0,k=0;j<max-1;j++){
			if(sweight[j]==0&&min>sweight[j]){
				min=sweight[j];//找到尚未在最小生成树中的顶点中距离最小的顶点
				k=j;
			}
		}
		sweight[k]=0;//找到之后标记在最小生成树中
		for(j=0;j<max;j++){
			if(sweight[j]==0&&sweight[j]>weight[k][j]){
				sweight[j]=weight[k][j];//更新不在最小生成树中的顶点到最小生成树的最小距离
				edge[j]=k;//标记边(k,j)
			}
		}
	}
}

Dijkstra算法

void Dijkstra(int start){//start为起点
	int sweight[max],wfound[max]={0};//wfound数组标记是否找到最短路径,为1,则是
	int spath[max];//记录路径
	int i,j,k=0;
	for(i=0;i<max;i++){
		sweight[i]=weight[start][i];//初始化
		spath[i]=start;
	}
	wfound[start]=1;//标记start点已找到
	sweight[start]=0;//在最短路径中,则sweight为0
	for(i=0;i<max-1;i++){//max-1次循环
	int min=infinity;
		for(j=0,k=0;j<max;j++){
			if(sweight[j]<min&&wfound[j]==0){
				min=sweight[j];//找到不在最短路径中的最小值
				k=j;
			}
		}
		wfound[k]=1;//标记找到
		sweight[k]=0;//标记找到
		for(j=0;j<max;j++){
			if(wfound[j]==0&&sweight[j]>weight[j][k]+min){
				sweight[j]=min+weight[j][k];//添加k定点后更新距离
				spath[j]=k;//更新路径
			}
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值