Kruskal算法 (转载)

本文介绍了一个使用C语言实现的最小生成树(MST)算法,该算法通过输入顶点数和边数,读取每条边的权重,并采用排序与并查集思想来找出图中的最小生成树。

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

#include <stdio.h>
#include<stdlib.h>
#include <string.h>
#define maxnodenum 100
#define maxedgenum 100
typedef struct
{
 int u, v, weight;
}edge;
edge edges[maxedgenum + 1];
int nodes[maxnodenum + 1];
static int compare(const void *x, const void *y);
int main()
{
 int argc, char **argv;
 int i, j, m, n, nodenum, edgenum, boolean, safe;
 int presult = 0, flag = 1, find = 0;
 scanf("%d %d", &nodenum, &edgenum);//点和边的数
 //getchar();
 for(i = 0; i < edgenum + 1; i++)
 {
  scanf("%d %d %d", &edges[i].u, &edges[i].v,
   &edges[i].weight);
  getchar();
 }
 qsort((void *)&edges[0], edgenum, sizeof(edge), compare);//sort all edge's weight in ascending
                /* printf("/n");for(i = 0; i < edgenum; i++)
                printf("%d %d %d/n", edges[i].u, edges[i].v,
                edges[i].weight);
    printf("/n");*/
 for(i = 0; i < edgenum ; i++)
 {
  if(presult == nodenum - 1){//found mst
   find = 1;
   break;
  }
  m = edges[i].u;//u.v是边的两个点;
  n = edges[i].v;
  safe = 0;
  if(nodes[m] == 0 && nodes[n] == 0)
  {
   nodes[m] = nodes[n] = flag++;
   safe = 1;//a safe edge
  }
  else if(safe == 0 && (nodes[m] == 0 || nodes[n] == 0))
  {
   (nodes[m] == 0) ? (nodes[m] = nodes[n]) :(nodes[n] = nodes[m]);
   safe = 1;//a safe edge
  }
  else if(safe == 0 && nodes[m] != nodes[n])
  {
   for(j = 0; j < nodenum + 1 ; j++){
    if(nodes[j] == nodes[m] || nodes[j] == nodes[n]){
     nodes[j] = flag;
    }
   }
   flag++;
   safe = 1;//a safe edge
  }
  if(safe == 1){//reserve a safe edge
   edges[presult].u = m;
   edges[presult].v = n;
   edges[presult].weight = edges[i].weight;
   presult++;
  }
 }
 if(find == 1){//print the founded mst
  for(i = 0; i < presult; i++){
   printf("%d->%d %d/n", edges[i].u, edges[i].v, edges[i].weight);
  }
 }
 return 0;
}
static int compare(const void *x, const void *y)
{
 return ( ((edge *)x)->weight - ((edge *)y)->weight );
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值