#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);
}
prim算法生成最小生成树
最新推荐文章于 2024-02-15 20:50:29 发布