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