南桥c语言培训,最小生成树,cruskal算法

该博客介绍了一种使用C语言实现图的最小生成树(Prim's算法)的方法。首先定义了边和图的数据结构,接着通过`init()`函数初始化图,包括输入顶点和边的信息。然后`display()`函数用于展示图的顶点和边。`sort_Graph()`函数对边按权重进行排序,最后`cruskal()`函数应用kruskal算法找出最小生成树。博客展示了完整的C代码实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include

#include

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值