1、大连民族学院计算机科学与工程学院实验报告实验题目: 最小生成树的 Kruskal 算法 课程名称: 离散数学 实验类型:演示性 验证性 操作性 设计性 综合性专业:软件工程 班级:111 学生姓名:xx 学号:xx 实验日期:2012 年 12 月 6-28 日 实验地点:金石滩校区机房 201实验学时: 10 学时 实验成绩:指导教师: 焉德军 姜楠 2012 年 12 月 28 日实验原理设所给定无向连通加权图具有 n 个结点,m 条边,首先,将各条边的权按从小到大的顺序排序。然后依次将这些边按所给图的结构放到生成树中去。如果在放置某一条边时,使得生成树形成回路,则删除这条边。这样,直至生
2、成树具有 n-1 条边时,我们所得到的就是一棵最小生成树。实验内容给定无向连通加权图,编程设计求出其一棵最小生成树。实验目的通过算法设计并编程实现求出给定无向连通加权图的一棵最小生成树,加深学生对求最小生成树的 Kruskal 算法的理解。实验步骤(1) 边依小到大顺序得 l1,l 2,l m。(2) 置初值: S,0 i,1 j。(3) 若 i=n-1,则转(6) 。(4) 若生成树边集 S 并入一条新的边 lj之后产生的回路,则 j+1 j,并转(4) 。(5) 否则,i+1 i;l j S(i) ;j+1 j,转(3) 。(6) 输出最小生成树 S。(7) 结束。具体程序的 C+实现如下
3、:#include using namespace std;const int MaxVertex = 20;const int MaxEdge = 100;const int MaxSize = 100;struct EdgeTypeint from;int to;int weight;struct EdgeGraphchar vertexMaxVertex;EdgeType edgeMaxEdge;int vertexNum;int edgeNum;int FindRoot(int parent, int v); void InputInfo();void Kruskal(EdgeGrap
4、h G)int vex1,vex2,f,t;int i,num;int parentMaxVertex;for(i=0; i -1)t = parentt;return t;void InputInfo()EdgeGraph G;cout G.vertexNum G.edgeNum;cout G.vertexi;cout G.edgej.from G.edgej.to G.edgej.weight;Kruskal(G);int main()InputInfo();system(“pause“);return 0;实验过程中遇到的问题及解决过程比如不知道如何存储边集数组,以及比知道如何声明一些变
5、量,函数和怎样去调用Kruskal函数解决:通过设置结构体EdgeType与结构体EdgeGraph的联合来存储边集,因为在刚开始我在主函数中用EdgeGraph声明变量G,来作为形参去调用Kruskal(G),编译时就会警告未被初始化的G,的程序出错,后来我将Kruskal(G)在InputInfo()中调用,因为InputInfo()函数中声明了变量G,并使得G初始化,从而是的程序能正常运行。测试的图与预期生成的最小树实验记录实验总结,感想通过这次的上机实验,加深了我对课本上的理论知识的认识与理解,然我真实的体验到了从研究问题到解决问题的探索中产生的乐趣,并且体会到问题解决的成就感,虽然在上机调试的时候产生了很多的错误,但经过自己查阅资料,请教同学老师而将问题一一的解决让我体会到学习所带来的乐趣,我希望今后能又更多的理论与实践相结合的课程设计作业,而不是单一的理论的学习。