运筹学最小生成树问题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
趣,在具体操作中对所学的C语言的理论知识得到了巩固,达到实训的目的也发现
了自己的不足之处,在以后的上机中应更加注意,同时体会到了C语言具有语句简
洁,使用灵活,执行效率高等特点,并且通过此次运筹学课程设计,我们通过C语
言将其中抽象的最小树问题比较直观的变现出来,掌握了求最小树问题的克鲁斯
卡尔算法以及邻接矩阵的构造,特别是对C语言中数组和循环有了深刻的了解。通
过实际操作将C语言编程和运筹学有机的结合起来,学会了C语言编程的基本步骤
和基本方法,开发了自己的逻辑思维能力,培养了分析问题和解决问题的能力。
收获与致谢
• 在此衷心感谢学院安排这次课设,让我们又多了一次学习交流的机会,更好的巩固 了所学的知识,拓展了知识面。本次课设能取得成功,要感谢张爱霞老师的帮助和 指导。在课设期间老师帮助我们分析思路,提供方法,才使得我们的程序做的更加 的完善。其次是要感谢和我同组的同学感谢对方对本次课设的付出。
•{
minitree_KRUSKAL();
函数调用
•
printf("输出邻接矩阵是:\n");
•
ljjzprint(n); 输出矩阵
•
return 0; }
调试过程
• 原设计在定义输出矩阵函数时,没有形参,在调用时必须输入树的定点数这和前 面的函数在输入树的数据时重复操作,为了避免重复如果这个函数添加一个参数 为n的形参,再main函数调用minitree_KRUSKAL();后n为定值,n为了在 ljjzprint(n)中为已知量则需在程序的开头定义一个全局变量n即可。在求最小生 成树的代价时,因为其顶点的权值时变的 故重新定义个变量sum,以实现其权值 的相加然后输出。
克鲁斯卡尔算法
• while (i <n)
•
{
min=INFINITE;
•
for (j=0;j <m;j++)
•
{
•
if (e[j].weight <min&&e[j].flag==0)
•
{
•
min=e[j].weight;
•
sum+=min;
•
k=j; }Fra Baidu bibliotek}
•
if (t[e[k].vexh].jihe!=t[e[k].vext].jihe)
邻接矩阵的定义
• 邻接矩阵(Adjacency Matrix):是表示顶点之间相邻关系的矩阵。设G=(V,E)是 一个图,其中V={v1,v2,…,vn}。G的邻接矩阵是一个具有下列性质的n阶方阵:
•
①对无向图而言,邻接矩阵一定是对称的,而且对角线一定为零,有向图则
不一定如此。
•
②在无向图中,任一顶点i的度为第i列所有元素的和,在有向图中顶点i的出
参考文献
• 《运筹学教程》(第三版)胡运权主编 • 《C程序设计》(第三版)谭浩强编著 • 《C程序设计题解与上机指导》(第三版)谭浩强编著
• Thank you!
运筹学课程设计
• 设计题目:最小生成树问题 • 班级:**** • 课设指导:***老师 • 设计者:LMZZ • 设计日期:2011,09,01
目录Contents
• 1、最小生成树的概念 • 2、课程设计方案 — 1)克鲁斯卡尔算法
2) 邻接矩阵 • 3、设计方案实施 • 4、结果与结论 • 5、收获与致谢 • 6、参考文献
邻接矩阵
• void ljjzprint(int n)/*定义并输出邻接矩阵*/
•{
int i,j;
•
for(i=1;i<=n;i++)
•
{
•
for(j=1;j<=n;j++)
•
printf("%d\t",adjmatrix[i][j]);
•
printf("\n");
•
}
•}
• int main()
度为第i行所有元素的和,而入度为第i列所有元素的和。
•
③用邻接矩阵法表示图共需要n^2个空间,由于无向图的邻接矩阵一定具
有对称关系,所以扣除对角线为零外,仅需要存储上三角形或下三角形的数据即
可,因此仅需要n(n-1)/2个空间。
方案实施
• 1、定义结构体以及各个变量; • 2、数据的输入; • 3、采用克鲁斯卡尔算法求出该图的最小生成树; • 4、采用邻接矩阵做储存结构创建图; • 5 、在主函数中分别调用以上各个函数,最终实现设计目的。
概念篇
设计方案
• 本设计是在C语言环境下运行的,主要有 minitree_KRUSKAL()此函数包含几个 算法有对树的邻接矩阵的构造,数据的输入,克鲁斯卡尔算法(又称Kruskal算 法,其类似于求生成树的“避圈法”)求网的最小生成树,最小生成树的最小 代价,输出最小生成树的顶点及其最小代价。ljjzprint(int n)定义并输出邻 接矩阵。
• 主程序:
• int main()
•{
•
minitree_KRUSKAL(); (函数调用)
•
printf("输出邻接矩阵是:\n");
•
ljjzprint(n);
(函数调用)
•}
Kruskal算法
• 这个方法类似于求生成树的“避圈法”,基本步骤如下: 每步从未选的边中选取边e,使它与已选边不构成圈,且e是未选边中的最小 权边,直到选够n-1条边为止。
• 顶点为:a,b,c, d , e, 其标号分别为1,2, 3,4,5
• Vexh和vext分别为边 的两端顶点,
• weight为边的权值运 行如下:
结果与结论
收获与致谢
•
紧张而又忙碌的课设学习终于结束了,在本次课设中我们也取得了相对
很大的成就,通过本次课程设计我们也学到了很多,它增加了我们编程软件的兴
•
{
e[k].flag=1;
•
for (j=1;j <=n;j++)
•
if (t[j].jihe==t[e[k].vext].jihe)
•
t[j].jihe=t[e[k].vexh].jihe;
•
t[e[k].vext].jihe=t[e[k].vexh].jihe;
•
i++; }
•
else e[k].flag=2; }