kruskal

 

//kruskal


#include<iostream>
#include<stdlib.h>
#include<malloc.h>
using namespace std;


#define TOPMAX  60000
#define MAX 100

//邻接矩阵
typedef struct _graph
{
	char vexs[MAX];//顶点
	int vexnum;//顶点数
	int edgnum;//边数
	int matrix[MAX][MAX];//保存矩阵的信息
}Graph,*PGraph;
//边的结构图
typedef struct _EdgeData
{
	char start;
	char end;
	int weight;
}EData;


void CreateJuzhen(Graph &G)
{
	int i, j = 0;
	G.vexnum = 9;
	for (i = 0; i < G.vexnum; i++)
	{
		G.vexs[i] = 65 + i;
		cout << "i的值为:" << G.vexs[i] << endl;
	}
	G.vexs[G.vexnum] = '\0';
	G.edgnum = 15;	
	for (i = 0; i < G.vexnum; i++)
	{
		for (j = 0; j < G.vexnum; j++)
		{
			if (i == j)
				G.matrix[i][j] = 0;
			else
				G.matrix[i][j] = TOPMAX;
		}
	}
		G.matrix[0][1] = 10;
		G.matrix[0][5] = 11;
		G.matrix[1][2] = 18;
		G.matrix[1][8] = 12;
		G.matrix[1][6] = 16;
		G.matrix[2][8] = 8;
		G.matrix[2][3] = 22;
		G.matrix[3][8] = 21;
		G.matrix[3][7] = 16;
		G.matrix[3][4] = 20;
		G.matrix[4][7] = 7;
		G.matrix[4][5] = 26;
		G.matrix[5][6] = 17;
		G.matrix[6][7] = 19;
	for (i = 0; i < G.vexnum; i++)
	{
			for (j = 0; j < G.vexnum; j++)
				G.matrix[j][i] = G.matrix[i][j];
	}

	
}
static int get_position(Graph G, char ch)
{
	int i;
	for (i = 0; i < G.vexnum; i++)
	{
		if (ch == G.vexs[i])
			return i;
	}
	return -1;
}




	void Print(Graph G)
	{
		int i, j;
		for (i = 0; i < G.vexnum; i++)
		{
			for (j = 0; j < G.vexnum; j++)
				cout << G.matrix[i][j] << "  ";
			cout << endl;
		}
	}

	//获取图中的边
	EData* get_edges(Graph G)
	{
		int i, j;
		int index=0;
		EData *edges = NULL;
		edges = (EData *)malloc(G.edgnum * sizeof(EData));
		if (NULL == edges)
		{
			cout << "error" << endl;
			return NULL;
		}
		for (i = 0; i < G.vexnum; i++)
		{
			for (j = i + 1; j < G.vexnum; j++)
			{
				if (G.matrix[i][j] != TOPMAX)
				{
					edges[index].start = G.vexs[i];
					edges[index].end = G.vexs[j];
					edges[index].weight = G.matrix[i][j];
					index++;
				}
			}
		}
		return edges;
}

//对边按照权值大小排序


	void sorted_edges(EData *edges, int elen)
	{
		int i, j;
		EData tmp;
		for (i = 0; i < elen; i++)
		{
			for (j = i + 1; j < elen; j++)
			{
				if (edges[i].weight > edges[j].weight)
				{
					tmp = edges[i];
					edges[i] = edges[j];
					edges[j] = tmp;
				}
			}
		}
}
	//获取i的终点
	int get_end(int vends[], int i)
	{
		if (i >= 0)
		{
			while (vends[i] != 0)
				i = vends[i];
		}
		return i;

	}

	void kruskal(Graph G)
	{
		int i, m, n, p1, p2;
		int length;
		int index = 0;
		int vends[MAX] = { 0 };// 用于保存"已有最小生成树"中每个顶点在该最小树中的终点
		EData rets[MAX];// 结果数组,保存kruskal最小生成树的边
		EData *edges=NULL; // 图对应的所有边
		// 获取"图中所有的边"
		edges = get_edges(G);
		if (edges == NULL)
			return;
		sorted_edges(edges, G.edgnum);
		for (i = 0; i < G.edgnum; i++)
		{
			p1 = get_position(G, edges[i].start);// 获取第i条边的"起点"的序号
			p2 = get_position(G, edges[i].end);// 获取第i条边的"终点"的序号

			m = get_end(vends, p1);
			n = get_end(vends, p2);
			if (m != n)
			{
				vends[m] = n;
				rets[index++] = edges[i];
			}

		}
		length = 0;
		for (i = 0; i < index; i++)
			length += rets[i].weight;
		cout << "Kruskal:" << length << endl;
		for (i = 0; i < index; i++)
			cout << "(" << rets[i].start << "," << rets[i].end << ")" << endl;


}



int main()
{
	Graph G;
	CreateJuzhen(G);
	Print(G);
	kruskal(G);
	system("pause");
	return 0;
}



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值