最小生成樹,cruskal算法

#include<stdio.h>數組

#include<stdlib.h>優化

#define Max 10code

#define Max_edge 20排序

typedef char elementType;element

//定義邊的集合get

typedef struct Edge_g {it

int start;

int end;

int weight;

}Edge;io

//定義圖頂點相關的內容sort

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;

}

相關文章
相關標籤/搜索