图的最小生成树

原创 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;  
}  



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

相关文章推荐

图的最小生成树

题目描述 最小生成树问题是实际生产生活中十分重要的一类问题。假设需要在n个城市之间建立通信联络网,则连通n个城市只需要n-1条线路。这时,自然需要考虑这样一个问题,即如何在最节省经费的前提下建立这个...

图的最小生成树

#include #include #define QUEUE_MAXSIZE 30 #define VERTEX_MAX 26 #define MAXVALUE 99999 ty...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

图的最小生成树

最小生成树:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。目前用Kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。...

图的最小生成树

针对无向图,而且图必须联通。最小生成树是指保持图的联通性的基础上保留n-1条边,裁剪掉其它边,保证留下来的边的权值总和最小而且不可以存在环路(裁剪原则)。通常有Prim算法和Kruskal算法。其中P...

图的最小生成树

基本概念 最小生成树(最小支撑树,MST-minimum-cost spanning tree) 图G为带权连通图,MST为一个包含G所有顶点及其(|V|-1) 条边(子集)的自由树:边...

图的最小生成树

1、最小生成树概述 在电子电路设计中,我们常常将多个组件的针脚连接在一起。假如要连接n个针脚,那么我们需要使用n-1条连 线,并且希望连线长度最短。针对这个问题,我们可以采用无向连通图G=(V,E...

图的最小生成树

一、克鲁斯卡尔算法 克鲁斯卡尔算法的核心思想是:每次添加权值尽可能小的边,同时使新的图无环,直到得到生成树为止。也称为“最小边加入法”“避圈法” 思路:对于带权图G(V,E),首先将图G中...

图的最小生成树

连通分量:图的极大连通子图。 最小生成树(minimumcost spanning tree 即:MST):         n个点,n-1条边,构成一个连通图,求其中代价最小的连通图。 MS...

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

树(自由树)、无序树和有根树      自由树就是一个无回路的连通图(没有确定根)(在自由树中选定一顶点做根,则成为一棵通常的树)。      从根开始,为每个顶点(在树中通常称作结点)的孩子...

最小生成树 最小树形图

/**************************** Kruskal算法 *****************************/ int father[maxn],n,m; int fi...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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