图的最小生成树

原创 2015年07月06日 19:29:32
#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);//输出邻接矩阵  
  
/************************************************************************   
函数名称:CreateMatrixGraph   
函数功能:创建邻接矩阵图 
函数参数: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;  
    }  
}  
/************************************************************************   
函数名称:OutMatrix   
函数功能:输出邻接矩阵 
函数参数:G是定义的图结构的指针 
函数返回:无  
************************************************************************/  
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");     
}  
/**********************************************************
*******上面是图的代码
*******下面是生成最小树的程序
***********************************************************/
/************************************************************************   
函数名称:Prim   
函数功能:生成最小树
函数参数:图G 
函数返回:0表示成功 
************************************************************************/  
#define USED 0
#define NOADJ -1
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)
			tmpvertex[i] = NOADJ;
		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);
}

/************************************************************************   
函数名称:main   
函数功能:测试图 
函数参数:无 
函数返回:0表示成功 
************************************************************************/  
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;  
}  



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

图的操作,最小生成树的源代码

  • 2007年11月20日 15:55
  • 533B
  • 下载

图和最小生成树&lt;prim实现&gt;

  • 2008年06月12日 13:28
  • 4KB
  • 下载

数据结构 学习笔记(九):图(下):最小生成树(Prim,Kruskal 算法),拓扑排序 AOV,关键路径 AOE

最小生成树什么是最小生成树解决最小生成树有很多算法,但是归结起来都是贪心算法。贪心算法: 什么是“贪”:每一步都要最好的 什么是“好”:权重最小的边 但是因为是最小生成树,所以这个贪心算法还需要约束:...
  • Jurbo
  • Jurbo
  • 2017年07月10日 15:43
  • 646

图的最小生成树java代码

  • 2012年04月16日 15:52
  • 2KB
  • 下载

(1.2.6.3)最小生成树--Kruskal算法:O(elog2e) 适合稀疏图

Kruskal算法     求解最小生成树的另一种常见算法是Kruskal算法,它比Prim算法更直观。从直观上看,Kruskal算法的做法是:每次都从剩余边中选取权值最小的,当然,这条边不能使已有...

无向图 破圈法求最小生成树

  • 2014年03月09日 18:51
  • 5KB
  • 下载

图的建立及最小生成树

  • 2010年07月09日 23:07
  • 59KB
  • 下载

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

求加权连通图的最小生成树的算法。kruskal算法总共选择n- 1条边,所使用的贪婪准则是:从剩下的边中选择一条不会产生环路的具有最小耗费的边加入已选择的边的集合中。注意到所选取的边若产生环路则不可能...

随机生成一个图,求最小生成树

  • 2010年05月26日 00:09
  • 108KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:图的最小生成树
举报原因:
原因补充:

(最多只允许输入30个字)