prim算法生成最小生成树

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#include<string.h>
#include<ctype.h>
#include<malloc.h>
#include<limits.h>
#include<stdio.h>
#include<stdlib.h>
#include<io.h>
#include<math.h>
#include<process.h>
typedef int Status;
#define MN 20 
#define INF 1000 
typedef char vertexType;
typedef int arcType;
typedef struct { 
	vertexType vexs[MN];
	arcType arcs[MN][MN];
	int vexnum,arcnum;
}MGraph;
typedef struct{
	int fromvex,tovex;
	int cost;
}MST[MN-1];
typedef struct{
int fromvex,tovex;
int cost;
}Edge;
typedef Edge *EdgeNode;
MGraph CreateMGraph(){
int i,j,k,c;
MGraph G;
printf("输入图的顶点数目和边的数目: ");
scanf("%d%d",&G.vexnum,&G.arcnum);
getchar();//K/4KEk
printf("输入图的各项点信息: \n");
for(i=0;i<G.vexnum;i++)scanf("%c" ,&G.vexs[i]); 
for(i=0;i<G.vexnum;i++) 
	for(j=0;j<G.vexnum;j++)
		G.arcs[i][j]=INF;
for(k=0;k<G.arcnum;k++)//根据输入的边的信息构造邻接矩阵
{
printf("请输入第%d条边的两个端点的序号及权值(i,j,c): ",k+1);
scanf("%d, %d,%d" ,&i,&j,&c);
G.arcs[i][j]=c;
G.arcs[j][i]=c;
}
return G;
}
int InitCondidateSet( MGraph G,int r,EdgeNode T){
//构造初始的候选轻边集T [0..n-2],因为初始红边集为空,所以T全部放绿边。
int i,k=0;//i为兰点序号,k为数组下标
	for(i=0;i<r;i++)
	if(i!=r){//r为树根,即选出∪中的第- - -红点
		T[k].fromvex=r;
		T[k].tovex=i;
		T[k].cost=G.arcs[r][i];
		k++;
}//if
}//
int SelectLightEdge(int k,int r,EdgeNode T){
	int i; 
//k为当前红边数,则T [0..k-1] 放红边,T [k.n-2]放绿边
int min=INF,minpos; //min 代表最小权值,minpos 为当前最小权值边的序号
for(i=k;i<r-1;i++) //遍历 当前绿边集T [k..n-2], 找轻边
if(T[i].cost<min){
min=T[i].cost; minpos=i;
}//if
return minpos;
}
int ModifySet (MGraph G ,EdgeNode T,int k,int v,int r){
	int i,d;
//为新加入红点的顶点序号, k为红边数.
for(i=k;i<r-1;i++){ //从 [k.n-2] 调整轻边候选集
d=G.arcs[v][T[i].tovex]; //d 是新绿边的权
if(d<T[i].cost){
T[i].cost=d;
T[i].fromvex=v;
}//if
}//for
}
int primMST(MGraph G,int r,EdgeNode T){
	int k,m,v;
//用prim算法从顶点r出发,构造MST,r是该树的根
 InitCondidateSet(G,r,T);
for(k=0;k<r-1;k++){
m=SelectLightEdge(k,r,T); //m为从T [k..n-2] 中选出的轻边T [m]e=T[m]; T[m]=T[k]; T[k]=e; //交换
v=T[k].tovex; //v 为新红点编号
ModifySet(G,T,k+1,v,r);//k+1为刚生成红边集的红边数
}//for
}//primMST
int main(){
	EdgeNode T;
	MGraph G=CreateMGraph();
	int r,i;
	printf("请输入第一个项点的序号:");
	scanf("%d",&r);
	primMST(G,r,T);
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值