分享
 
 
 

最小生成树的定义以及有关算法

王朝知道·作者佚名  2012-09-26
窄屏简体版  字體: |||超大  
 
分類: 電腦/網絡 >> 程序設計 >> 其他編程語言
 
問題描述:

请给出定义

与有关算法的名字(给名字即可,有具体代码更佳)

參考答案:

Kruskal算法和Prim算法

任何只由G的边构成,并包含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)

作者:

baihacker

时间:

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年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有