# 最小生成树prim普里姆算法

**头文件

#pragma once
#include<stdio.h>
#include<stdlib.h>
#define OVERFLOW -2
#define INFINITY 1000 //无穷大
#define MN 6 //图的顶点数目
typedef char vertexType;
typedef int arcType;


#include"c1.h"

typedef struct {
vertexType vexs[MN];
arcType arcs[MN][MN];
int vexnum, arcnum; // 顶点数和边数
}MGraph;

MGraph G;

typedef struct{
int fromvex, tovex;
int cost;
}MST[MN- 1];  // 边的存储结构

MST T; //存放G的最小生成树，作为prim的输出

void CreateMGraph() {
int i, j, k, c;
printf("请输入图的顶点数目和边的数目: ");
scanf_s("%d%d", &G.vexnum, &G.arcnum);
getchar();  //收集垃圾 回车键
printf("输入图的各项点信息: \n");
for (i = 0; i < G.vexnum; i++)
scanf_s("%c", &G.vexs[i]);
for (i = 0; i < G.vexnum; i++)
for (j = 0; j < G.vexnum; j++)
G.arcs[i][j] = INFINITY;
for (k = 0; k < G.arcnum; k++) {

printf("请输入第%d条边的两个端点的序号及权值(i,j,c): ", k + 1);
scanf_s("%d,%d,%d", &i, &j, &c);
G.arcs[i][j] = c;
G.arcs[j][i] = c;

}
}
void InitCondidateSet(MGraph G,int r) {

int i, k = 0;
for (i = 0; i < G.arcnum; i++)
{
if (i != r) {
T[k].fromvex = r;
T[k].tovex = i;
T[k].cost = G.arcs[r][i];
k++;
}
}
}
int SelectLightEdge(int k)
{
int min = INFINITY, minpos = 0;;
for(int i = k;i<MN-1;i++)
if (T[i].cost < min) {
min = T[i].cost;
minpos = i;
}
return minpos;
}
void ModifySet(int k, int v) {
int d;
for (int i = k; i < MN - 1; i++) {
d = G.arcs[v][T[i].tovex];

if (d < T[i].cost) {
T[i].cost = d;
T[i].fromvex = v;
}
}
}
void primMST(MGraph G, int r) {
int m,v;
MST e;
InitCondidateSet(G, r);
for (int k = 0; k < MN - 1; k++) {
m = SelectLightEdge(k);
e[0] = T[m];
T[m] = T[k];
T[k] = e[0];
v = T[k].tovex;
ModifySet(k + 1, v);
}
}
int main()
{
int num;
CreateMGraph();
printf("请输入第一个项点的序号: ");
scanf_s("%d",&num);
primMST(G, num);
for (int i = 0; i < MN - 1; i++)
{
printf("第%d条边：V%d----V%d; 权值为%d\n", i + 1, T[i].fromvex, T[i].tovex, T[i].cost);
}
system("pause");
return 0;
}


ps: 收货：结构体数组typedef struct

typedef int arr[5];
typedef arr* p_arr5;
typedef p_arr5 arrp10[10];
arr5 tog5;   //togs是具有5个元素的int数组
p_arr5 p2;   //p2是一个指针，指向具有元素的数组
arrp10 ap;   //ap是具有十个元素的指针数组，每个指针指向具有五个元素的int数组


typedef struct{
int fromvex, tovex;
int cost;
}MST[MN- 1];  // 边的存储结构

MST T;


struct{
int fromvex, tovex;
int cost;
}T[MN- 1];


typedef char arr[10];
arr a;//就定义了一个有十个char型变量；


05-22 3521

04-27 6951
06-17 4906
03-10 104
09-08 1万+
07-21 529
08-29 353
12-18
12-20
09-18
01-27
08-20