# 图的最小生成树

#include <stdio.h>
#include <stdlib.h>

#define QUEUE_MAXSIZE 30
#define VERTEX_MAX 26
#define MAXVALUE 99999

typedef struct
{
char Vertex[VERTEX_MAX];//保存顶点信息，序号或字母
int Edges[VERTEX_MAX][VERTEX_MAX];//保存边的权
int isTrav[VERTEX_MAX];//遍历标志
int VertexNum;//顶点的数量
int EdgeNum;//边的数量
int GraphType;//图的类型，0：无向图；1：有向图
}MatrixGraph;

void CreateMatrixGraph(MatrixGraph *G);//创建邻接矩阵图
void OutMatrix(MatrixGraph *G);//输出邻接矩阵

/************************************************************************

************************************************************************/
void CreateMatrixGraph(MatrixGraph *G)
{
int i, j, k, weight;
char start, end;

printf("输入各个顶点的信息\n");
for (i = 0; i < G->VertexNum; i++)
{
getchar();
printf("第%d个顶点：", i+1);
scanf("%c", &(G->Vertex[i]));
}

printf("输入构成各边的两个顶点及权值（用逗号分隔）:\n");
for (k = 0; k < G->EdgeNum; k++)
{
getchar();
printf("第%d条边:", k+1);
scanf("%c,%c,%d", &start, &end, &weight);
for (i = 0; start != G->Vertex[i]; i++);//在已有顶点中查找起始点
for (j = 0; end != G->Vertex[j]; j++);//在已有顶点中查找终点
G->Edges[i][j] = weight;
if (G->GraphType == 0)
G->Edges[j][i] = weight;
}
}
/************************************************************************

************************************************************************/
void OutMatrix(MatrixGraph *G)
{
int i, j;
for (j = 0; j < G->VertexNum; j++)
{
printf("\t%c", G->Vertex[j]);
}
printf("\n");
printf("      ------------------------------------\n");
for (i = 0; i < G->VertexNum; i++)
{
printf("    %c |", G->Vertex[i]);
for (j = 0; j < G->VertexNum; j++)
{
if (G->Edges[i][j] == MAXVALUE)
printf("\t∞");
else
printf("\t%d", G->Edges[i][j]);
}
printf("\n");
}
printf("\n");
}
/**********************************************************
*******上面是图的代码
*******下面是生成最小树的程序
***********************************************************/
/************************************************************************

************************************************************************/
#define USED 0
void Prim(MatrixGraph G)
{
int i, j, k, min, sum = 0;
int weight[VERTEX_MAX];
char tmpvertex[VERTEX_MAX];//临时顶点信息

for (i = 1; i < G.VertexNum; i++)
{
weight[i] = G.Edges[0][i];
if (weight[i] == MAXVALUE)
else
tmpvertex[i] = G.Vertex[0];
}
tmpvertex[0] = USED;
weight[0] = MAXVALUE;
for (i = 1; i < G.VertexNum; i++)
{
min = weight[0];
k = i;
for (j = 1; j < G.VertexNum; j++)
{
if (weight[j] < min && tmpvertex[j] != 0)
{
min = weight[j];
k = j;
}
}
sum += min;
printf("(%c,%c)", tmpvertex[k], G.Vertex[k]);
tmpvertex[k] = USED;
weight[k] = MAXVALUE;
for (j = 0; j < G.VertexNum; j++)
{
if (G.Edges[k][j] < weight[j] && tmpvertex[j] != 0)
{
weight[j] = G.Edges[k][j];
tmpvertex[j] = G.Vertex[k];
}
}
}
printf("\n最小生成树的总权值为:%d\n", sum);
}

/************************************************************************

************************************************************************/
int main()
{
MatrixGraph G;
int i, j;
char select;

do
{
printf("输入生成图的类型(0:无向图,1:有向图):");
scanf("%d", &G.GraphType);

printf("输入图的顶点数量和边数量:");
scanf("%d,%d", &G.VertexNum, &G.EdgeNum);

//清空矩阵
for (i = 0; i < G.VertexNum; i++)
for (j = 0; j < G.VertexNum; j++)
G.Edges[i][j] = MAXVALUE;

CreateMatrixGraph(&G);
printf("邻接矩阵数据如下:\n");
OutMatrix(&G);

printf("最小生成树的边如下：\n");
Prim(G);
printf("继续进行吗？(Y/N)");
scanf("%c", &select);
getchar();
}while (select != 'N' && select != 'n');

getchar();
getchar();
return 0;
}  

• 本文已收录于以下专栏：

## 【算法复习】图的最小生成树（Prim&Kruskal）

• qjzl2008
• 2012年10月31日 23:25
• 6943

## 图---生成树与最小生成树

• u012335419
• 2013年11月12日 16:02
• 4923

## java实现图的最小生成树问题

• qq_33535433
• 2017年07月10日 21:46
• 216

## 图的最小生成树算法

• u010585135
• 2014年12月25日 23:13
• 530

## 图的最小生成树Prim算法朴素版(C++)

Prim算法从一个节点开始不断选择权值最小的边加入当前已有的树结构，最终遍历完所有的节点得到最小生成树。时间复杂度为O(V^2)。V为图中顶点个数。C++代码如下：#include #include...
• zhujiahui622
• 2016年08月10日 15:01
• 936

## 数据结构之图-无权图的最小生成树(7)

1 Unweighted Graphs  For unweighted Graphs, a minimum  spanning tree(MST) means that a graph with mi...
• zhongyangzhong
• 2013年03月11日 13:15
• 1331

## 图--生成树和最小生成树

• heavenboya
• 2011年08月02日 18:27
• 32799

## java 普里姆（Prim）算法求图的最小生成树

1. 基本思想： 设G=(V,E)是连通网，T=(U,D)是最小生成树，V,U是顶点集合，E,D是边的集合 ①若从顶点u开始构造最小生成树，则从集合V中取出顶点u放入集合U中，标记顶点v的visi...
• yxmmao
• 2016年06月04日 22:05
• 562

## 图基本算法 最小生成树 Prim算法（邻接表/邻接矩阵+优先队列STL）

• tham_
• 2015年05月27日 16:47
• 3132

## Kruskal算法求图的最小生成树的完整C代码

• u014488381
• 2014年11月24日 16:41
• 8319

举报原因： 您举报文章：图的最小生成树 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)