#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;
}