#include <stdio.h>
#include <stdlib.h>
//定义一个值为无法到达的点的值
#define MAX 36767
//图的结构
typedef struct Graph{
char *vexs;
int**arcs;
int vexnum;
int arcnum;
}graph;
//集合的结构
typedef struct Edge{
char vex;
int weight;
}edge;
//初始化图
graph* init(int vexnum){
graph*G=(graph*)malloc(sizeof(graph));
G->vexs=(char*)malloc(sizeof(char)*vexnum);
G->arcs=(int**)malloc(sizeof(int*)*vexnum);
for(int i=0;i<vexnum;i++){
G->arcs[i]=(int*)malloc(sizeof(int)*vexnum);
}
G->vexnum=vexnum;
G->arcnum=0;
return G;
}
//图的创建
void create(graph*G,char*vex,int*arcs){
for(int i=0;i<G->vexnum;i++){
G->vexs[i]=vex[i];
for(int j=0;j<G->vexnum;j++){
G->arcs[i][j]=*(arcs+i*G->vexnum+j);
if(G->arcs[i][j]!=0&&G->arcs[i][j]!=MAX){
G->arcnum++;
}
}
}
G->arcnum/=2;
}
//初始化集合
edge* initedge(graph*G,int index){
edge*E=(edge*)malloc(sizeof(edge)*G->vexnum);
for(int i=0;i<G->vexnum;i++){
E[i].vex=G->vexs[index];
E[i].weight=G->arcs[index][i];
}
return E;
}
//找出集合中与集合距离最小的点的索引
int getmin(graph*G,edge*E){
int min=MAX;
int index;
for(int i=0;i<G->vexnum;i++){
if(E[i].weight!=0&&E[i].weight<min){
min=E[i].weight;
index=i;
}
}
return index;
}
//prim算法
void prim(graph*G,int index){
int min;
//先把一个点加进集合进行初始化
edge*E=initedge(G,index);
//因为已经添加一个点了,所以循环G->vexnum-1次
for(int i=0;i<G->vexnum-1;i++){
//找出集合中与集合距离最小的点的索引
min=getmin(G,E);
//输出从集合中找到的点和权值
printf("%c->%c,weight=%d\n",E[min].vex,G->vexs[min],E[min].weight);
//将找到的点在集合的距离赋值为0
E[min].weight=0;
//把该点加入集合并对集合中的权值和点进行更新
for(int j=0;j<G->vexnum;j++){
if(G->arcs[min][j]<E[j].weight){
E[j].weight=G->arcs[min][j];
E[j].vex=G->vexs[min];
}
}
}
}
int main(){
graph*G=init(6);
int *visited=(int*)malloc(sizeof(int)*G->vexnum);
for(int i=0;i<G->vexnum;i++){
visited[i]=0;
}
int arcs[6][6] = {
0, 6, 1, 5, MAX, MAX,
6, 0, 5, MAX, 3, MAX,
1, 5, 0, 5, 6, 4,
5, MAX, 5, 0, MAX, 2,
MAX, 3, 6, MAX, 0, 6,
MAX, MAX, 4, 2, 6, 0
};
create(G, "123456", (int*)arcs);
prim(G, 0);
return 0;
}
prim算法
最新推荐文章于 2024-08-30 15:57:36 发布