数据结构——图

xd_dong 2013-05-22 11:47:09
有哪位大神发发最小生成树的Kruskal 算法?
假定每对顶点表示图的一条边,每条边对应一个权值;
输入每条边的顶点和权值;
输入边后,计算出最小生成树。
...全文
87 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
startservice 2013-05-23
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
 
#define MAX 100
 
/* 定义边(x,y),权为w */
typedef struct
{
 int x, y;
 int w;
}edge;
 
edge e[MAX];
/* rank[x]表示x的秩 */
int rank[MAX];
/* father[x]表示x的父节点 */
int father[MAX];
int sum;
 
/* 比较函数,按权值(相同则按x坐标)非降序排序 */
int cmp(const void *a, const void *b)
{
 if ((*(edge *)a).w == (*(edge *)b).w)
 {
  return (*(edge *)a).x - (*(edge *)b).x;
 }
 return (*(edge *)a).w - (*(edge *)b).w;
}
 
/* 初始化集合 */
void Make_Set(int x)
{
 father[x] = x;
 rank[x] = 0;
}
 
/* 查找x元素所在的集合,回溯时压缩路径 */
int Find_Set(int x)
{
 if (x != father[x])
 {
  father[x] = Find_Set(father[x]);
 }
 return father[x];
}
 
/* 合并x,y所在的集合 */
void Union(int x, int y, int w)
{
 
 if (x == y) return;
 /* 将秩较小的树连接到秩较大的树后 */
 if (rank[x] > rank[y])
 {
  father[y] = x;
 }
 else
 {
  if (rank[x] == rank[y])
  {
   rank[y]++;
  }
  father[x] = y;
 }
 sum += w;
}
 
/* 主函数 */
int main()
{
 int i, n;
 int x, y;
 char chx, chy;
 
 /* 读取边的数目 */
 scanf("%d", &n);
 getchar();
 
 /* 读取边信息并初始化集合 */
 for (i = 0; i < n; i++)
 {
  scanf("%c %c %d", &chx, &chy, &e[i].w);
  getchar();
  e[i].x = chx - 'A';
  e[i].y = chy - 'A';
  Make_Set(i);
 }
 
 /* 将边排序 */
 qsort(e, n, sizeof(edge), cmp);
 
 sum = 0;
 
 for (i = 0; i < n; i++)
 {
  x = Find_Set(e[i].x);
  y = Find_Set(e[i].y);
  if (x != y)
  {
   printf("%c - %c : %d\n", e[i].x + 'A', e[i].y + 'A', e[i].w);
   Union(x, y, e[i].w);
  }
 }
 
 printf("Total:%d\n", sum);
 //system("pause");
 return 0; 
}
hugett 2013-05-23
  • 打赏
  • 举报
回复
网上不是大把么。。看看这个吧。。 http://blog.csdn.net/niushuai666/article/details/6689285

69,380

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧