最小生成树,cruskal算法

#include<stdio.h>

#include<stdlib.h>

#define Max 10

#define Max_edge 20

typedef char elementType;

//定义边的集合

typedef struct Edge_g {

int start;

int end;

int weight;

}Edge;

//定义图顶点相关的内容

typedef struct Graph_g {

elementType peek[Max];

int number_vertex;//定义顶点个数

int nubmer_edge;//定义边的个数

Edge edge[Max];

}Graph, *Graph_matrax;

//对图进行初始化

Graph_matrax init() {

Graph_matrax  graph = (Graph_matrax)malloc(sizeof(Graph));

int vertex;

printf("请输入顶点的个数\n");

scanf("%d", &vertex);

graph->number_vertex = vertex;

int i;

printf("请对顶点进行赋值\n");

for (i = 0; i < graph->number_vertex; i++) {

	printf("请对第%d个顶点进行赋值:", i);
	
	getchar();
	
	char c;
	
	scanf("%c", &c);
	
	graph->peek[i] = c;
	
}

printf("请输入边的个数:");

int edge_number;

scanf("%d", &edge_number);


graph->nubmer_edge = edge_number;

int start;

int end;

int weight;

printf("下面开始对边的相关信息进行赋值(注意起点终点的值大于1):\n");

for (i = 0; i < graph->nubmer_edge; i++) {

	printf("对第%d条边进行赋值,请输入边的起点start,终点end和权重:",i);
	
	scanf("%d%d%d", &start, &end, &weight);
	
	Edge e;
	
	e.start = start-1;
	
	e.end = end-1;
	
	e.weight = weight;

	graph->edge[i] = e;
}

return graph;

}

void display(Graph_matrax g) {

int i;

for (i = 0; i < g->number_vertex; i++) {

	printf("%c\n",g->peek[i]);
}

for (i = 0; i < g->nubmer_edge; i++) {

	printf("start=%d end=%d weight=%d\n", g->edge[i].start, g->edge[i].end, g->edge[i].weight);
}

}

int find(int parent[], int f) {

while (parent[f] > 0) {

	f = parent[f];
}

return f;

}

//对权重进行排序

void sort_Graph(Graph_matrax g) {

int max = g->edge[0].weight;

Edge e;

int i, j;

for (i = 0; i < g->nubmer_edge; i++) {

	for (j = 0; j < g->nubmer_edge-i-1; j++) {
	
		if (g->edge[j].weight > g->edge[j + 1].weight) {
		
			e = g->edge[j];
			
			g->edge[j] = g->edge[j + 1];
			
			g->edge[j + 1] = e;
		}
	}
}

}

void cruskal(Graph_matrax g) {

int parent[Max];

int i;

//对parent数组进行初始化

for (i = 0; i < g->number_vertex; i++) {

	parent[i] = 0;
}

int m, n;

//能不能优化下,次数不需要这么多

//稍微优化一下,最小生成树的边是顶点数-1,用temp来判断

int temp=0;

for (i = 0; i < g->nubmer_edge; i++) {

	if (temp == g->number_vertex - 1)
	
		break;
		
	m = find(parent,g->edge[i].start);
	
	n = find(parent, g->edge[i].end);
	
	if (n != m) {
	
		temp++;
		
		//注意这个地方,不能写反了
		
		parent[m] = n;
		
		printf("(%d-->%d) weifht=%d\n",
		
			g->edge[i].start+1, g->edge[i].end+1, g->edge[i].weight);
	}
}

}

int main() {

Graph_matrax g = init();

display(g);

sort_Graph(g);

display(g);

cruskal(g);

system("pause");

return 0;

}

转载于:https://my.oschina.net/u/2511906/blog/3098298

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值