kruskal算法的一点就是不能形成环路,而且是从排列好的边集合依次选出最小的边,每次选出的顶点都要放在同一个边集合中,之后在顶点集合选两个顶点的边,要求这两个顶点不能在边集合中,这样才能保障不形成环路。
一、链表表示
#include<stdio.h>
#include<stdlib.h>
/*
kruskal,最小生成树,利用链表,并查集的知识
*/
typedef struct{
int bef;
int aft;
int weight;
}pic_node;//图中点的结构体
typedef struct find_set{
int data;
struct find_set *next;
}NODE;//点集合的节点
typedef struct set_head{
NODE *head;
NODE *tail;
int flag;
}HEAD;//点集合的头
HEAD set[20];//点集合
pic_node arr[20];//开始时候数据
int edge;//边数
int s=0;
int vertex;//顶点数
void add_set(int a,int b);
void sort(pic_node arr[]);
int find(int who);
int main()
{
printf("enter the number of vertex:");//输入顶点个数
scanf(" %d",&vertex);
printf("enter the number of edges:");//输入边个数
scanf(" %d",&edge);
printf("enter bef,aft,weight:");//输入两点和权值
for(int i=0;i<edge;i++)