用kruskal算法构造例3的最小生成树是什么意思

 我来答
eykabin
2016-04-06 · 知道合伙人教育行家
eykabin
知道合伙人教育行家
采纳数:7040 获赞数:40219
本人毕业于河南省职业中等专业学校,从业五年来一直从事煤矿机电技术工作。

向TA提问 私信TA
展开全部
1.kruskal算法
假设连通网N=(V,{E})。则令最小生成树的初始状态为只有n个顶点而无边的非连通图T=(V,{}),图中每个顶点自成一个连通分量。在E中选择最小代价的边,若该边依附的顶点落在T中不同的连通分量中,则将该边加入到T中,否则舍去此边而选择下一条代价最小的边,依次类推,直到T中所有顶点都在同一连通分量上为止。
示例如下:

图中先将每个顶点看作独立的子图,然后查找最小权值边,这条边是有限制条件的,边得两个顶点必须不在同一个图中,如上图,第一个图中找到最小权值边为(v1,v3),且满足限制条件,继续查找到边(v4,v6),(v2,v5),(v3,v6),当查找到最后一条边时,仅仅只有(v2,v3)满足限制条件,其他的如(v3,v4),(v1,v4)都在一个子图里面,不满足条件,至此已经找到最小生成树的所有边。
2.kruskal算法程序设计
由于我们要查找边权值最小的边,那么我们的第一步应该把边权值排序,这样就可以很快查找到权值最小的边,为了简化程序设计,我们不使用其他的数据结构,仅仅设立一个结构体数组来存储边,用一个标记数组来标记哪些边已经被选择(实际程序设计的时候没有用到标记数组);
解决了边得存储和排序问题,现在是算法最关键的就是怎么判断边的两个顶点不在一个子图里面,一个简单的办法是设立一个辅助数组f[n],初始化如下:
void Initialize()
{
int i;
for(i=0; i
f[i] = i;
}
如此初始化是为了让每个顶点各自为一个图,如果找到一条边(i,j)那么做如下标记:(i
void Mark_same(int i, int j)
{
//找到i的父节点
while(f[i] != i)
{
i= f[i];
}
f[j] = i;//将j指向其父节点
}

上面的标记过程也给了我们怎么判断两个顶点是否在一个图中找到了方法,即判断其父节点是否相同,相同则是在一个图里;
int Is_same(int i, int j)
{
//找到i的父节点
while(f[i] != i)
{
i= f[i];
}
//找到i的父节点
while(f[j] != j)
{
j= f[j];
}
return i == j ? 1 : 0;
}

注意:实际设计程序的时候不用标记已选边,因为已选择的边会讲端点集合合并为一个集合,从而在判断是否为同一集合的时候就可以排除了。
光点科技
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件... 点击进入详情页
本回答由光点科技提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式