图的最小生成树

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



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

【算法复习】图的最小生成树(Prim&Kruskal)

所谓生成树就是 如果连通图G的一个子图是一棵包含G的所有顶点的树,则该子图称为G的生成树。 生成树是连通图的包含图中的所有顶点的极小连通子图。 (图的生成树不惟一。从不同的顶点出发进行遍历,...
  • qjzl2008
  • qjzl2008
  • 2012年10月31日 23:25
  • 6943

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

今天在做题的时候遇到一个问题,如何根据图的邻接表来画出DFS生成树和BFS生成树,有两年的真题中涉及到这个问题,在以前的学习中没注意过此问题,由于严奶奶的书上也只是一带而过,所以对它的理解也不深刻,作...
  • u012335419
  • u012335419
  • 2013年11月12日 16:02
  • 4923

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

最小生成树问题 1、针对带权无向图 2、针对连通图 最小生成树问题就是找到V-1条边连接V个顶点且总权值最小 切分定理 算法需要用到切分定理,切分即把图中的顶点分成两部分。若一条边的两个端点分别属于切...
  • qq_33535433
  • qq_33535433
  • 2017年07月10日 21:46
  • 216

图的最小生成树算法

图的最小生成树有两种算法: 一种是Kruscal算法:把图的每个节点看成是不同的集合,把所有的边都放入到优先级队列中去,不断从优先级队列中取出边,如果这个边的两端点属于不同的集合,那么就把这条边加入...
  • u010585135
  • u010585135
  • 2014年12月25日 23:13
  • 530

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

Prim算法从一个节点开始不断选择权值最小的边加入当前已有的树结构,最终遍历完所有的节点得到最小生成树。时间复杂度为O(V^2)。V为图中顶点个数。C++代码如下:#include #include...
  • zhujiahui622
  • 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
  • zhongyangzhong
  • 2013年03月11日 13:15
  • 1331

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

树(自由树)、无序树和有根树      自由树就是一个无回路的连通图(没有确定根)(在自由树中选定一顶点做根,则成为一棵通常的树)。      从根开始,为每个顶点(在树中通常称作结点)的孩子...
  • heavenboya
  • 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
  • yxmmao
  • 2016年06月04日 22:05
  • 562

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

这篇文章是对《算法导论》上Prim算法求无向连通图最小生成树的一个总结,其中有关于我的一点点小看法。   最小生成树的具体问题可以用下面的语言阐述:     输入:一个无向带权图G=(V,E)...
  • tham_
  • tham_
  • 2015年05月27日 16:47
  • 3132

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

求加权连通图的最小生成树的算法。kruskal算法总共选择n- 1条边,所使用的贪婪准则是:从剩下的边中选择一条不会产生环路的具有最小耗费的边加入已选择的边的集合中。注意到所选取的边若产生环路则不可能...
  • u014488381
  • u014488381
  • 2014年11月24日 16:41
  • 8319
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:图的最小生成树
举报原因:
原因补充:

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