网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > C/C++ > 正文
最小生成树Kruskal算法(C++)_C/C++_开发语言_软件
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/11/27
下载{$ArticleTitle}原创论文样式

  主要代码如下,如有什么问题可以及时回复

#include<iostream>
using namespace std;
const int MAX_EDGE = 100;
const int MAX_NODE = 100;
/*
定义一条边
*/
typedef struct{
 int v;
 int t;
 int weight;
 bool isMST;
}Edge;
/*
有关算法的一些变量
*/
Edge edges[MAX_EDGE];
int nodeSet[MAX_EDGE];
const int MSTSetNum = -1;
int edgeNum;
bool nodeIsMST[MAX_NODE];
int Exchange(Edge *a,Edge *b)
{
 Edge t;
 t = *a;
 *a = *b;
 *b = t;
 return 0;
}
/*
实现快速排序算法quick_sort
*/
int partition(Edge*edges,int p,int r)
{
  int i = p-1,j = p;
  
  for(;j<r;j++)
  {
   if(edges[j].weight <= edges[r].weight)
   {
    i++;
    exchange(edges+i,edges+j);
   }
  }
  exchange(&edges[i+1],&edges[r]);
  return i+1;
}
int quick_sort(Edge edges[],int p,int r)
{
 if(p < r)
 {
  int q = partition(edges,p,r);
  quick_sort(edges,p,q-1);
  quick_sort(edges,q+1,r);
 }
 return 0;
}
void Initialize(int nodeSet[],int edgeNum);
void MST_Kruskal(int n);
void test();
int main()
{
 test();
 return 0;
}
void Initialize(int nodeSet[],int n)
{
 if(edgeNum > MAX_EDGE)
 {
  printf("The total num of edges must be less than %d\n",MAX_EDGE);
  exit(EXIT_FAILURE);
 }
 else
 {
  int i = 0;
  edgeNum = n;
  for(;i<edgeNum;i++)
  {
   nodeSet[i] = i;
  }
 } 
}
void MST_Kruskal(int n)
{
 
 Initialize(nodeSet,n);
 quick_sort(edges,0,edgeNum-1);
 
 int i;
 for(i = 0;i<edgeNum;i++)
 {
  if(nodeSet[edges[i].v]!=nodeSet[edges[i].t])
  {
   
   edges[i].isMST = true;
   if(i==7)
    i = i;
   if(nodeIsMST[edges[i].v] || nodeIsMST[edges[i].t])
   {
    int j;
    for(j = 0;j<=i;j++)
    {
     if(edges[j].isMST)
     {
      if(edges[j].v == edges[i].v ||
       edges[j].t == edges[i].v||
       edges[j].v == edges[i].t||
       edges[j].t == edges[i].t)
       nodeSet[edges[j].v] = nodeSet[edges[j].t] = MSTSetNum;
     }
    }
    nodeIsMST[edges[i].v] = nodeIsMST[edges[i].t] = true;
   }
   else
   {
    nodeSet[edges[i].v] = nodeSet[edges[i].t];
    nodeIsMST[edges[i].v] = nodeIsMST[edges[i].t] = true;
   }
  }
 }
}
/*
测试函数
*/
void test()
{
 edges[0].v = 0,edges[0].t = 1,edges[0].isMST = false,edges[0].weight = 4;
 edges[1].v = 0,edges[1].t = 8,edges[1].isMST = false,edges[1].weight = 8;
 edges[2].v = 1,edges[2].t = 2,edges[2].isMST = false,edges[2].weight = 8;
 edges[3].v = 1,edges[3].t = 7,edges[3].isMST = false,edges[3].weight = 11;
 edges[4].v = 2,edges[4].t = 8,edges[4].isMST = false,edges[4].weight = 2;
 edges[5].v = 2,edges[5].t = 5,edges[5].isMST = false,edges[5].weight = 4;
 edges[6].v = 2,edges[6].t = 3,edges[6].isMST = false,edges[6].weight = 7;
 edges[7].v = 3,edges[7].t = 4,edges[7].isMST = false,edges[7].weight = 9;
 edges[8].v = 3,edges[8].t = 5,edges[8].isMST = false,edges[8].weight = 14;
 
 edges[9].v = 4,edges[9].t = 5,edges[9].isMST = false,edges[9].weight = 10;
 
 edges[10].v = 5,edges[10].t = 6,edges[10].isMST = false,edges[10].weight = 2;
 edges[11].v = 6,edges[11].t = 7,edges[11].isMST = false,edges[11].weight = 1;
 edges[12].v = 6,edges[12].t = 8,edges[12].isMST = false,edges[12].weight = 6;
 edges[13].v = 7,edges[13].t = 8,edges[13].isMST = false,edges[13].weight = 7;
 MST_Kruskal(14);
 int i,j;
 for(i = 0,j = 0;i<14;i++)
 {
  if(edges[i].isMST)
  {
   printf("%d. (%d,%d)-------%d\n",j+1,edges[i].v,edges[i].t,edges[i].weight);
   j++;
  }
 }
}

(责任编辑:admin)

网学推荐

免费论文

原创论文

浏览:
设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
湘ICP备09003080号