问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

图的所有生成树的算法

发布网友 发布时间:2022-04-19 09:43

我来回答

3个回答

热心网友 时间:2023-07-25 21:52

边构成,并包含G的所有顶点的树称为G的生成树(G连通).
加权无向图G的生成树的代价是该生成树的所有边的代码(权)的和.
最小代价生成树是其所有生成树中代价最小的生成树.

参考代码:
(仅为主程序,更多代码在

解压密码: )
#include "Sets.h"
#include "themap.h"
#include "windows.h"
#include <iostream>
#include <queue>
#include <vector>
using namespace std;

/*
功能:
演示Kruskal算法和Prim算法
集合的并,元素查找的操作及应用
说明:
代码均在vc++6.0环境下编译均通过
在非VC++6.0环境下编译请去掉头文件 windows.h 和函数 end()
如果NULL未定义请自定义
#define NULL 0 或
#define NULL ((void*)0)
作者:
hacker
时间:
2007.2.3
*/

const VSIZE = 7;//7个顶点
const INFINITY = 10000;//10000作为无穷大来处理

void LoadData(int cost[][VSIZE+1], Edge edge[]);
void end();

/*
函数名:
Kruskal 和 Prim
参数:
边,代价,边数,顶点数,最小代价生成树的顶点
返回值:
返回值为-1,不存在最小代价生成树
返回值大于0时为最小代价生成树的代价
最小代价生成树的边在vector<Edge>& t
*/
int Kruskal(Edge edge[], int cost[][VSIZE+1], int esize, int vsize, vector<Edge>& t);
int Prim (Edge edge[], int cost[][VSIZE+1], int esize, int vsize, vector<Edge>& t);

int main()
{
int cost[VSIZE+1][VSIZE+1];//0不用
Edge edge[9];//9条边
vector<Edge> t;//用来存储最小代价生成树的顶点
int mincost;//最小代价

LoadData(cost, edge);

if ( (mincost = Kruskal(edge, cost, 9, VSIZE, t))!=-1)
{
cout<<"最小代价是:"<<mincost<<endl<<"边是:";
for (int i = 0;i<t.size();i++)
cout<<t[i];
cout<<endl;
}

t.clear();
if ( (mincost = Prim(edge, cost, 9, VSIZE, t))!=-1)
{
cout<<"最小代价是:"<<mincost<<endl<<"边是:";
for (int i = 0;i<t.size();i++)
cout<<t[i];
cout<<endl;
}

end();
return 1;
}

void LoadData(int cost[][VSIZE+1], Edge edge[])
{
edge[0].u = 1; edge[0].v = 2; edge[0].weight = 28;
edge[1].u = 1; edge[1].v = 6; edge[1].weight = 10;
edge[2].u = 2; edge[2].v = 3; edge[2].weight = 16;
edge[3].u = 2; edge[3].v = 7; edge[3].weight = 14;
edge[4].u = 3; edge[4].v = 4; edge[4].weight = 12;
edge[5].u = 4; edge[5].v = 5; edge[5].weight = 22;
edge[6].u = 4; edge[6].v = 7; edge[6].weight = 18;
edge[7].u = 5; edge[7].v = 6; edge[7].weight = 25;
edge[8].u = 5; edge[8].v = 7; edge[8].weight = 24;

for (int i=1;i<=7;i++)
for (int j=1;j<=i;j++)
cost[i][j] = cost[j][i] = INFINITY;
for (i=0;i<9;i++)
cost[edge[i].u][edge[i].v] =
cost[edge[i].v][edge[i].u] = edge[i].weight;
}

int Kruskal(Edge edge[], int cost[][VSIZE+1], int esize, int vsize, vector<Edge>& t)
{
Sets s(esize);
priority_queue<Edge, vector<Edge>, EdgeGreater> pq;
int mincost = 0;

for (int i = 0;i<esize;i++)
//把所有的边放入优先队列
pq.push(edge[i]);

i = 0;
while (i<vsize-1 && !pq.empty())
{
Edge temp = pq.top();//取出当前权最小的边
pq.pop();

int j = s.SimpleFind(temp.u);
int k = s.SimpleFind(temp.v);

if (j!=k)//如果不构成环
{
i++;
t.push_back(temp);
mincost +=cost[temp.u][temp.v];
s.SimpleUnion(j, k);
}
}

if (i!=vsize-1)
{
t.clear();
return -1;
}
else
{
return mincost;
}
}

int Prim(Edge edge[], int cost[][VSIZE+1], int esize, int vsize, vector<Edge>& t)
{
priority_queue<Edge, vector<Edge>, EdgeGreater> pq;
vector<Edge> sortededge;
int i;

for (i =0;i<esize;i++)
pq.push(edge[i]);

for (i =0;i<esize;i++)
{//对边进行从小到大排列,放到sortededge中
sortededge.push_back(pq.top());
pq.pop();
}

int distance[VSIZE+1];
int j;
int mincost = sortededge[0].weight;
Edge temp = sortededge[0];

t.push_back(temp);
for (i=1;i<=vsize;i++)
distance[i] = 1;//每个点都不在已生成树里

distance[temp.u] = distance[temp.v] = 0;//最短的边的两个点放到生成树里

for (i=2;i<=vsize-1;i++)
{//寻找另外的边
int exist = 0;//设置是否找到符合条件的边的状态标志为未找到
for (j=1;j<esize;j++)
if (distance[sortededge[j].u] ^ distance[sortededge[j].v] == 1)
{//由于边是排序好了的,所以从小边向大边找,找到的第一个符合条件的边可以
//加到生成树里
int k = (distance[sortededge[j].u] == 0) ? sortededge[j].v :\
sortededge[j].u;
distance[k] = 0;
mincost += sortededge[j].weight;
t.push_back(sortededge[j]);
exist = 1;
break;
}
if (!exist)
{
t.clear();
return -1;
}
}

return mincost;
}

void end()
{
if (MessageBox(NULL,\
"欢迎到学习交流(源代码在论坛下载)\n\t\t(确定后自动访问论坛)",\
"supcoder", IDOK) == IDOK)
{
char cmdLine[] = "iexplore ";
char path[256];
char buf[256];
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
PROCESS_INFORMATION ProcessInformation;
GetSystemDirectory(buf, 256);
sprintf(path, "%c:\\Program Files\\Internet Explorer\\IEXPLORE.EXE", buf[0]);
CreateProcess(path,cmdLine, NULL, NULL, 1, 0, NULL, NULL, &si, &ProcessInformation);
}

cout<<"==============================================================================="<<endl;
cout<<"\t\t\t\t 谢谢使用!"<<endl;
cout<<"\t\t\t "<<endl;
Sleep(1000);
}

热心网友 时间:2023-07-25 21:53

图的所有生成树的算法
uskal算法和Prim算法
任何只由G的边构成,并包含G的所有顶点的树称为G的生成树(G连通).
加权无向图G的生成树的代价是该生成树的所有边的代码(权)的和.
最小代价生成树是其所有生成树中代价最小的生成树.

参考代码:
(仅为主程序,更多代码在

热心网友 时间:2023-07-25 21:53

图的所有生成树的算法
然而面对喜欢的人你能展现真实的自我。
图的生成树

图或网的生成树不是唯一的,从不同的顶点出发可以生成不同的生成树,但n个结点的生成树一定有n-1条边下面我们计算一下上面两棵生成树的权值之和。第一棵生成树的权值总和是:16+11+5+6+18=56;第二棵生成树的权值是:16+19+33+18+6=92。通常我们将权值总和最小的生成树称为最小生成树。...

图- 生成树和最小生成树 - 生成树

在BFS(或BFSM)算法的if语句中 加入生成树边(v i v j )的操作 可得到求BFS生成树的算法 【参见练习】注意 ①图的广度优先生成树的树高不会超过该图其它生成树的高度 ②图的生成树不惟一 从不同的顶点出发进行遍历 可以得到不同的生成树 生成树的通用定义 若从图的某顶点出发 可以系统地访问到...

生成树的方法有哪些?

在图论的数学领域中,如果连通图G的一个子图是一棵包含G的所有顶点的树,则该子图称为G的生成树(SpanningTree)。生成树是连通图的包含图中的所有顶点的极小连通子图。图的生成树不惟一。从不同的顶点出发进行遍历,可以得到不同的生成树。常用的生成树算法有DFS生成树、BFS生成树、PRIM 最小生成树和...

【离散数学】树(二)最小生成树基本原理

算法的不同,就会导致寻找到的生成树不同,所以,如果一个图含有生成树,一般情况下不止一棵 在一个图的所有生成树中,权值最小的树被称为最小生成树 打个比方,一个图表示一个省,在省内的各个市之间需要修建公路,图中的每条边的权值表示修建这条公路的费用,如何修建一条连贯各示且费用最低的...

为什么图的bfs生成树的树高比dfs生成树的树小或相等

图的bfs生成树的树高比dfs生成树的树小或相等的原因如下:1、广度优先搜索(BFS)和深度优先搜索(DFS)是两种常见的图遍历算法。2、BFS是层序遍历,每次都会把离根节点最近的节点先进行遍历,这样能够保证搜索到的节点数目不会超过树的深度,也就不会超过树的最大高度。3、DFS是递归进行的,它从根...

直观理解:最小生成树算法Prime和Kruskal

算法的执行过程如下图所示:  将联通图 中所有的边按其权值由小到大的次序进行排序,对边的权值按从小到大的顺序进行选取,若该边选取后与已选择的边无法形成回路,则保留当前边,否则跳过当前边,选择下一条。依次选够 条边即可得到最小生成树,其中 为连通图 中的顶点个数。

有什么方法可以找出一个连通图的所有不同的生成树?

1.可以有多棵最小生成树 例如图(i-j k :点i到j间有边且权为k)1-2 1 2-3 1 1-3 1 选边1-2,2-3是边权和为2的最小生成树 选边1-3,2-3也是边权和为2的最小生成树 2.树是e=v-1边数最少的无向连通图,故必有树 ...

最小生成树 克鲁斯卡尔(Kruskal)算法

普利姆(Prime)算法是以点为基础,选择与已有点相连的最小边。而克鲁斯卡尔(Kruskal)算法是以边为基础,先将边从小到大排列,然后从小到大添加不构成「环路」的边。在判断「环路」时,使用的是并查集的数据结构。求下面图的最小生成树,首先将边从小到大排列,如下表所示:选取最小的边 BC,选取第...

生成树算法的作用

该算法的作用如下:1、求最小生成树:利用生成树算法,可以求解连通图中的最小生成树。最小生成树算法可以帮助我们优化网络设计、资源分配等问题。2、检测图的连通性:如果一个图不连通,那么它就不具有生成树。生成树算法可以用于检测图的连通性,这对于网络设计、电路设计等有很大的帮助。3、求解哈密...

证明 在n个结点中枚举所有生成树的数量为n的n-2次方个

如果用Kirchhoff定理,那么将完全图的Laplace矩阵代入后一步就可以得到Cayley公式,但是Kirchhoff定理本身的证明也不简单,这里就不写了。下面构造Prüfer序列。对一棵有编号的n节点的树,构造长度为n-2的序列{P_i}:选取编号最小的叶节点(即度数为1,可以是根节点),将与之相邻的节点编号记为P_i,并...

有向图有没有生成树 透明网桥的生成树算法 简述生成树算法的步骤 生成树算法的作用 生成树和最小生成树 生成树算法详解 最大生成树算法 列表生成树算法 stp生成树算法
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
上海2013中考二模浦东新区和静安区市重点参考录取分数线 2012上海中考自荐 腾讯服务器崩溃了吗 淘宝店铺名怎么工商注册 开淘宝店需要办理工商营业登记册吗?怎么办理? 淘宝开店需要个体户工商证吗?怎么开店? 腾讯垃圾服务器 西安水岸龙庭怎么样?好不好?值不值得买? 任何人都可以发腾讯黄金红包吗? 夫妻是否可以单方面强制离婚 数据结构中图的建立及输出的课程设计 数据结构课程设计题目,图的建立以及遍历。 图的算法中, 404 Not Found 图的最小生成树算法? 求图的生成树的算法有哪些? 图的建立 C语言图的创建和遍历算法,紧急 图的算法 数据结构 图的创建与访问算法 图的算法实现 急急急~~~~~~~~~ 数据结构中图的建立及算法实现 索尼电视机型号有什么含义 索尼电视机型号如何表示 sony是电视的什么牌子 索尼电视怎么样 索尼电视语音为啥叫小微 索尼电视的质量和效果怎样? 日本的索尼电视怎么调制成中国语言啊。求解 索尼电视语音开机要喊好多次是什么原因 404 Not Found 数据结构的图的算法 一般图形voronoi图的自动生成算法怎么做? 图算法 c++ 手机系统异常是什么意思 常用的会计软件有哪些? 初级会计电算化 会计软件的生命周期分为哪几个阶段,并简述 会计电算化和会计软件的名词解释 专业会计软件的名词解释是什么 和会计软件是一个么 谁有免费破解版的财务软件(中小企业) 我国会计软件行业急待解决的几个问题 软件的破解版,和没破解版的什么区别? 有没有破解版能用的会计软件? 我国当前管理型会计软件应用遇到的主要问题是什么?如何解决 财务软件哪些好用(免费的或者破解版) 下载圆梦会计软件怎么解压?急 财务软件破解 财务软件(破解版) 金蝶会计软件出现这种问题怎么解决啊 关于会计软件和手工记账,比较急于了解