- 浏览: 34137 次
-
最新评论
#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 101
struct stuEdge
{
int nFrom;
int nCost;
int nTo;
};
int nInput(stuEdge stuArr[],int nN);
void vSort(int nEdge,stuEdge stuArr[]);
bool bCmp(const stuEdge &stuA,const stuEdge &stuB);
void vMem(int nArr[],int nN);
int nKruskal(int nArr[],stuEdge stuArr[],int nN);
void vCombine(int nN,int nArr[],int nFrom,int nTo);
void vOutput(int nOut);
int main()
{
int nNum;
int nEdgeNum;
int nSet[MAX];
int nAns;
stuEdge stuEdgeArr[MAX*(MAX-1)/2+1];
while(1==scanf("%d",&nNum))
{
nEdgeNum=nInput(stuEdgeArr,nNum);
vSort(nEdgeNum,stuEdgeArr);
vMem(nSet,nNum);
nAns=nKruskal(nSet,stuEdgeArr,nNum);
vOutput(nAns);
}
return 0;
}
int nInput(stuEdge stuArr[],int nN)
{
int i,j;
int nCount;
int nTemp;
nCount=0;
for(i=1;i<=nN;i++)
{
for(j=1;j<=nN;j++)
{
scanf("%d",&nTemp);
if(i<j)
{
nCount++;
stuArr[nCount].nCost=nTemp;
stuArr[nCount].nFrom=i;
stuArr[nCount].nTo=j;
}
}
}
return nCount;
}
void vSort(int nEdge,stuEdge stuArr[])
{
sort(&stuArr[1],&stuArr[nEdge+1],bCmp);
}
bool bCmp(const stuEdge &stuA,const stuEdge &stuB)
{
return (stuA.nCost<stuB.nCost);
}
void vMem(int nArr[],int nN)
{
int i;
for(i=1;i<=nN;i++)
{
nArr[i]=i;
}
}
int nKruskal(int nArr[],stuEdge stuArr[],int nN)
{
int nRet;
int nCount;
int nEdgeInd;
int nF,nT;
nRet=0;
nCount=nN;
nEdgeInd=1;
while(nCount>1)
{
nF=nArr[stuArr[nEdgeInd].nFrom];
nT=nArr[stuArr[nEdgeInd].nTo];
if(nF!=nT)
{
nRet+=stuArr[nEdgeInd].nCost;
nCount--;
vCombine(nN,nArr,nF,nT);
}
nEdgeInd++;
}
return nRet;
}
void vOutput(int nOut)
{
printf("%d\n",nOut);
}
void vCombine(int nN,int nArr[],int nFrom,int nTo)
{
int i;
for(i=1;i<=nN;i++)
{
if(nArr[i]==nTo)
{
nArr[i]=nFrom;
}
}
}
#include<algorithm>
using namespace std;
#define MAX 101
struct stuEdge
{
int nFrom;
int nCost;
int nTo;
};
int nInput(stuEdge stuArr[],int nN);
void vSort(int nEdge,stuEdge stuArr[]);
bool bCmp(const stuEdge &stuA,const stuEdge &stuB);
void vMem(int nArr[],int nN);
int nKruskal(int nArr[],stuEdge stuArr[],int nN);
void vCombine(int nN,int nArr[],int nFrom,int nTo);
void vOutput(int nOut);
int main()
{
int nNum;
int nEdgeNum;
int nSet[MAX];
int nAns;
stuEdge stuEdgeArr[MAX*(MAX-1)/2+1];
while(1==scanf("%d",&nNum))
{
nEdgeNum=nInput(stuEdgeArr,nNum);
vSort(nEdgeNum,stuEdgeArr);
vMem(nSet,nNum);
nAns=nKruskal(nSet,stuEdgeArr,nNum);
vOutput(nAns);
}
return 0;
}
int nInput(stuEdge stuArr[],int nN)
{
int i,j;
int nCount;
int nTemp;
nCount=0;
for(i=1;i<=nN;i++)
{
for(j=1;j<=nN;j++)
{
scanf("%d",&nTemp);
if(i<j)
{
nCount++;
stuArr[nCount].nCost=nTemp;
stuArr[nCount].nFrom=i;
stuArr[nCount].nTo=j;
}
}
}
return nCount;
}
void vSort(int nEdge,stuEdge stuArr[])
{
sort(&stuArr[1],&stuArr[nEdge+1],bCmp);
}
bool bCmp(const stuEdge &stuA,const stuEdge &stuB)
{
return (stuA.nCost<stuB.nCost);
}
void vMem(int nArr[],int nN)
{
int i;
for(i=1;i<=nN;i++)
{
nArr[i]=i;
}
}
int nKruskal(int nArr[],stuEdge stuArr[],int nN)
{
int nRet;
int nCount;
int nEdgeInd;
int nF,nT;
nRet=0;
nCount=nN;
nEdgeInd=1;
while(nCount>1)
{
nF=nArr[stuArr[nEdgeInd].nFrom];
nT=nArr[stuArr[nEdgeInd].nTo];
if(nF!=nT)
{
nRet+=stuArr[nEdgeInd].nCost;
nCount--;
vCombine(nN,nArr,nF,nT);
}
nEdgeInd++;
}
return nRet;
}
void vOutput(int nOut)
{
printf("%d\n",nOut);
}
void vCombine(int nN,int nArr[],int nFrom,int nTo)
{
int i;
for(i=1;i<=nN;i++)
{
if(nArr[i]==nTo)
{
nArr[i]=nFrom;
}
}
}
发表评论
-
最大子段和
2012-01-05 13:59 794给出N个数字, 计算出最大的子段和。 Input 第一行给 ... -
最长不下降子序列长度
2012-01-05 13:55 1356对于序列(1, 7, 3, 5, 9, 4,,有它的一些不下降 ... -
求两字符串匹配的最长子序列
2012-01-05 13:52 1032如果两种特征序列的公共子序列越长表示越接近,现在请你帮助计算出 ... -
编辑距离问题
2012-01-05 13:48 681#include<iostream> #incl ... -
prime
2011-12-01 20:09 626#include<iostream> using ... -
哈弗曼编码
2011-11-28 10:43 1#include<iostream> #defi ... -
哈弗曼编码
2011-11-28 10:42 557#include<iostream> #defi ... -
#贪心算法(零件加工)
2011-10-27 13:25 1012#include<stdio.h> #includ ... -
众数问题
2011-10-20 14:57 812#include <stdio.h> #inclu ... -
输油管道问题
2011-10-13 14:45 628#include <stdio.h> #inclu ... -
幂的精确求值
2011-09-22 15:07 477#include<iostream> using ... -
大数加法
2011-09-22 12:56 638#include<iostream> #incl ... -
三姐妹之出题
2011-09-15 14:15 701#include<iostream> #incl ... -
最大子段和问题(分治)(##)
2011-09-08 21:31 678#include<stdio.h> #defin ... -
最大子段和问题(O(N^2))
2011-09-08 15:04 625#include<stdio.h> int a[ ... -
最大子段和问题(O(N^3))
2011-09-08 14:45 499#include<stdio.h> int a[ ...
相关推荐
Kruskal算法是求解加权无向图最小生成树的经典算法之一,由Joseph Kruskal在1956年提出。本文将详细介绍Kruskal算法的原理、实现步骤以及C++编程实践。 **Kruskal算法的基本思想:** Kruskal算法的核心理念是逐步...
我自己编写的一个C++ kruskal最小生成树程序,希望可以对初学者有所帮助,错误难以避免,希望大家谅解
编写算法能够建立带权图,并能够用Kruskal算法求该图的最小生成树。最小生成树能够选择图上的任意一点做根结点。最小生成树输出采用顶点集合和边的集合的形式。
对给定的图结构,实现求解最小生成树的Kruskal算法。每次在满足和已选边不构成回路的条件下选择一条权植最小的边,添加到新的生成数中。Kruskal算法的实现类似于计算连通枝的算法。它使用了分离集合数据结构以保持数...
该程序是我写的博客“一起talk C栗子吧(第五十回:C语言实例--最小生成树二)”的配套程序,共享给大家使用
【Kruskal最小生成树算法】是图论中的一个重要算法,属于贪心算法的一种。它的基本思想是:从图中权重最小的边开始,逐步添加边到生成树中,但要确保每次添加的边不会形成环路。算法分为以下几个关键点: 1. **算法...
以前的作业,为了挣点分,呵呵。 基本都能够运行的,当作作业不错。
《图的基本操作与Kruskal最小生成树实验报告》 实验报告主要涵盖了图的基本操作,包括图的存储结构、遍历算法以及一个实际的实验设计。在这个实验中,重点是理解并实现图的深度优先遍历(DFS)和广度优先遍历(BFS...
【标题】:“图的基本操作与kruskal最小生成树实验报告” 【描述】:该文档是一份关于图的基本操作的实验报告,特别是针对图的深度优先遍历(DFS)和广度优先遍历(BFS)的实现。实验旨在巩固图论知识,熟悉图的...
最后,`最小生成树-Kruskal`这个文件可能是Kruskal算法的具体实现代码,可能包含一个或多个文件,如C++、Java、Python等语言的实现。通过阅读和理解这些代码,你可以更深入地掌握Kruskal算法的细节以及并查集的运用...
最小生成树的graph形式,易于操作 在界面上画点,划线和输入各线权值,即可生成最小生成树
### 使用Prim和Kruskal算法构建最小生成树 在图论中,最小生成树(Minimum Spanning Tree, MST)是一个非常重要的概念。对于一个连通的无向图来说,如果存在一个子图,它包含原图的所有顶点,并且这些顶点通过边...
prim最小生成树的C++代码,代码长度为95行,使用C++编写
数据结构课程设计报告最小生成树Kruskal算法 数据结构课程设计报告中,我们将使用Kruskal算法来生成最小生成树,该算法是图论中的一种经典算法,能够在给定的图中找到最小生成树。下面,我们将对Kruskal算法的实现...
代码 最小生成树Kruskal算法代码代码 最小生成树Kruskal算法代码代码 最小生成树Kruskal算法代码代码 最小生成树Kruskal算法代码代码 最小生成树Kruskal算法代码代码 最小生成树Kruskal算法代码代码 最小生成树...
1. **引言**:介绍最小生成树的概念,以及Prim和Kruskal算法的基本思想。 2. **算法描述**:详细解释两种算法的步骤,包括伪代码或流程图。 3. **实现细节**:展示如何用编程语言(如C++、Java或Python)实现这两种...
在通信网理论作业3-最小生成树这个项目中,你可能会学习如何用MATLAB编写代码,实现Prim和Kruskal算法,并对给定的网络图数据进行最小生成树的构造。这将涉及到数据结构的设计、图的遍历以及最小生成树的验证等编程...
如果不在,说明添加这条边不会形成环路,将其加入到最小生成树中,并使用并查集合并这两个顶点所在的连通分量。 4. **循环直至连通**:重复步骤3,直到添加的边数量等于顶点数量减一,即形成了一个连通的树。 在...
### 最小生成树Kruskal算法详解 #### 算法背景与定义 最小生成树(Minimum Spanning Tree,简称MST)是图论中的一个经典问题,涉及到在一个加权图中寻找一棵包含所有顶点的子图,使得这棵子图的总权重最小。在实际...