#include <stdio.h>
#include <stdlib.h>
//定义一个值为无法到达的点的值
#define MAX 36767
//图的结构
typedef struct Graph{
char *vexs;
int**arcs;
int vexnum;
int arcnum;
}graph;
//边的结构
typedef struct Edge{
int start;//起点
int end;//终点
int weight;//权值
}edge;
//初始化图
graph* init(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 create(graph*G,char*vex,int*arcs){
for(int i=0;i<G->vexnum;i++){
G->vexs[i]=vex[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;
}
//初始化边
edge*initedge(graph*G){
int index=0;
edge*E=(edge*)malloc(sizeof(edge)*G->arcnum);
//将图中的边加进边的集合(除了自身和权值为MAX的点,即与该点不连通的点)
//因为是无向图,所以只要考虑图的二维矩阵的三角形区域
for(int i=0;i<G->vexnum;i++){
for(int j=i+1;j<G->vexnum;j++){
if(G->arcs[i][j]!=MAX){
E[index].start=i;
E[index].end=j;
E[index].weight=G->arcs[i][j];
index++;
}
}
}
return E;
}
//对边进行排序,这里是冒泡排序
void sortedge(edge*E,graph*G){
edge temp;
for(int i=0;i<G->arcnum;i++){
for(int j=i+1;j<G->arcnum;j++){
if(E[j].weight<E[i].weight){
temp=E[j];
E[j]=E[i];
E[i]=temp;
}
}
}
}
//kruskal算法
void kruskal(graph*G){
//创建一个可查看是否连通的集合
int*connected=(int*)malloc(sizeof(int)*G->vexnum);
for(int i=0;i<G->vexnum;i++){
connected[i]=i;
}
edge* E=initedge(G);
sortedge(E,G);
//遍历边
for(int i=0;i<G->arcnum;i++){
int start=connected[E[i].start];
int end=connected[E[i].end];
//如果起点和终点不一样,则可以输出,并将终点与起点相连通。
if(start!=end){
printf("%c->%c weight=%d\n",G->vexs[E[i].start],G->vexs[E[i].end],E[i].weight);
for(int j=0;j<G->vexnum;j++){
if(connected[j]==end){
connected[j]=start;
}
}
}
}
}
int main(){
graph*G=init(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
};
create(G, "123456", (int*)arcs);
kruskal(G);
return 0;
}
kruskal算法的实现
最新推荐文章于 2024-10-01 23:05:47 发布