数据结构——Kruskal法最小生成树

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#define MAX 65535
typedef struct Graph{
    char * vexs;
    int ** arcs;
    int vexNum;
    int arcNum;
}Graph;
typedef struct Edge{
    int start,end,weight;
}Edge;
Edge* initEdge(Graph* G){
    int index = 0;
    Edge* edge = (Edge*)malloc(sizeof(Edge)*G->arcNum);
    for(int i = 0; i < G->vexNum; i++){
        for(int j = i + 1; j < G->vexNum;j++){
            if(G->arcs[i][j] != MAX){
                edge[index].start = i;
                edge[index].end = j;
                edge[index].weight = G->arcs[i][j];
                index++;
            }
        }
    }
    return edge;
}
void sortEdge(Edge* edge,Graph* G){
    Edge temp;
    for(int i = 0; i < G->arcNum-1; i++){
        for(int j = 0;j < G->arcNum - i - 1;j++){
            if(edge[j].weight > edge[j+1].weight){
                temp = edge[j];
                edge[j] = edge[j+1];
                edge[j+1] = temp;
            }
        }
    }
}
void KruskalTree(Graph* G){
    int* connected = (int*)malloc(sizeof(int)*G->vexNum);
    for(int i = 0; i < G->vexNum; i++){
        connected[i] = i;
    }
    Edge* edge=initEdge(G);
    sortEdge(edge,G);
    for(int i = 0; i < G->arcNum; i++){
        int start = connected[edge[i].start];
        int end = connected[edge[i].end];
        if(start != end){
            printf("%c->%c,weight=%d\n",G->vexs[edge[i].start],G->vexs[edge[i].end],edge[i].weight);
            for(int j = 0; j < G->vexNum;j++){
                if(connected[j] == end){
                    connected[j] = start;
                }
            }

        }
    }

}
Graph* initGraph(int vexNum){
    Graph *G = (Graph*)malloc(sizeof(Graph));
    G->vexs = (char*)malloc(sizeof (char)*vexNum);
    G->arcs = (int**)malloc(sizeof(int*)*vexNum);
    for(int i = 0 ; i < vexNum ; i++){
        G->arcs[i] = (int*)malloc(sizeof(int)*vexNum);
    }
    G->vexNum = vexNum;
    G->arcNum = 0;
    return G;
}
void createGraph(Graph* G,char *vexs,int *arcs){
    for(int i = 0 ; i < G->vexNum ; i++){
        G->vexs[i] = *(vexs+i);
        for(int j = 0 ; j < G->vexNum ; j++){
            G->arcs[i][j] = *(arcs+i*G->vexNum+j);
            if(G->arcs[i][j] != 0 && G->arcs[i][j] != MAX){
                G->arcNum++;
            }
        }
    }
    (G->arcNum)/=2;
}
void DFS(Graph *G,int *visited,int index){
    printf("%c\t",G->vexs[index]);
    visited[index] = 1;
    for(int i = 0 ; i < G->vexNum ; i++){
        if(G->arcs[index][i] > 0 && G->arcs[index][i] != MAX && visited[i] == 0){
            DFS(G,visited,i);
        }
    }
}
int main() {
    Graph*G=initGraph(6);
    int *visited=(int*)malloc(sizeof (int )*G->vexNum);
    for(int i = 0;i <G->vexNum;i++){
        *(visited+i) = 0;
    }
    int arcs[6][6]={
            0,6,1,5,MAX,MAX,
            6,0,5,MAX,3,MAX,
            1,5,0,5,6,4,
            5,MAX,5,0,MAX,2,
            MAX,3,6,MAX,0,6,
            MAX,MAX,4,2,6,0
    };
    createGraph(G,"ABCDEF",(int*)arcs);
    DFS(G,visited,0);
    printf("\n");
    KruskalTree(G);
    printf("%d",G->arcNum);
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

karwen2020

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值