实验六 最小代价生成树

实验名称:最小代价生成树

实验章节:算法设计与分析第6章

实验目的: 掌握贪心算法解决问题的思想和一般过程,
           学会使用普里姆算法解决实际问题。

提交形式: 所有作业的原程序和可执行程序(即cpp文件和exe文件)

纸质实验报告(格式和内容请参阅末页)

实验内容

完善下列程序,并回答问题。

  1 #include<iostream.h>
  2
  3 #define G_NODE_NUM 6  //结点个数
  4
  5 #define INFTY 65535
  6
  7 template<class T>
  8
  9 struct ENode
 10
 11 {//带权图的边结点
 12
 13        int adjVex;
 14
 15        T w;
 16
 17        ENode* nextArc;
 18
 19 };
 20
 21 template <class T>
 22
 23 class Graph
 24
 25 {
 26
 27 public:
 28
 29        Graph (int mSize){
 30
 31               n = mSize;
 32
 33               a = new ENode<T> *[mSize];
 34
 35               for(int i = 0; i< n ;i++){
 36
 37                      a[i] = NULL;
 38
 39               }
 40
 41        }
 42
 43        void Prim(int s);
 44
 45        void putin(T X[G_NODE_NUM][G_NODE_NUM]);
 46
 47        void putout();
 48
 49 protected:
 50
 51        void Prim(int k, int* nearest, T* lowcost);
 52
 53        ENode<T>** a;
 54
 55        int n;
 56
 57 };
 58
 59
 60
 61 template<class T>
 62
 63 void Graph<T>::putin(T X[G_NODE_NUM][G_NODE_NUM]){
 64
 65        ENode<T> *e;
 66
 67        for(int i = 0; i < n; i++){
 68
 69               for(int j = 0; j < n; j++){
 70
 71                      if(X[i][j]>0){
 72
 73                             e = new ENode<T>();
 74
 75                             e->adjVex = j;
 76
 77                             e->w = X[i][j];
 78
 79                             e->nextArc = a[i];
 80
 81                             a[i] = e;
 82
 83                      }
 84
 85               }
 86
 87        }
 88
 89 }
 90
 91 template<class T>
 92
 93 void Graph<T>::putout(){
 94
 95        ENode<T> *e;
 96
 97        cout<<"---图输出---"<<endl;
 98
 99        for(int i=0; i<n; i++){
100
101               e = a[i];
102
103               cout<<endl<<"第"<<i<<"个节点:";
104
105               while(e!=NULL){
106
107                      cout<<" "<<e->adjVex<<"("<<e->w<<")";
108
109                      e=e->nextArc;
110
111               }
112
113        }
114
115        cout<<endl;
116
117 }
118
119
120
121 template<class T>
122
123 void Graph<T>::Prim(int s)
124
125 {
126
127        学生书写部分
128
129 };
130
131
132
133 template<class T>
134
135 void Graph<T>::Prim(int k, int* nearest, T* lowcost)
136
137 {
138
139        学生书写部分
140
141 }
142
143
144
145 void main(){
146
147        Graph<int> *G;
148
149        int data[G_NODE_NUM][G_NODE_NUM]={   {0,6,1,5,0,0},
150
151                                                                              {6,0,5,0,3,0},
152
153                                                                              {1,5,0,5,6,4},
154
155                                                                              {5,0,5,0,0,2},
156
157                                                                              {0,3,6,0,0,6},
158
159                                                                              {0,0,4,2,6,0}};
160
161        int n = G_NODE_NUM;
162
163        G = new Graph<int>(n);
164
165        G->putin(data);
166
167        G->putout();
168
169        G->Prim(0);
170
171 }

程序问题

  1. 分析算法,说明算法中涉及到的变量k、nearest、lawcast、mark,分别表示的语义是什么。
  2. 画出Prim算法的流程图。
  3. 运行课本第109页图6-10的普里姆算法,生成的子树是什么? (程序自带输入部分)
  4. 在程序的适当位置,增加“cout<<"第"<<k<<"个节点加入生成树\n";”语句,输出加入节点的次序。
  5. 试着推理,或者在程序中增加输出语句,说明从第1个节点开始,每一次循环三元组<nearest[i], i, lowcost[i]>的变化。
  6. 若是8个节点的图,如下所示,设计相应的输入邻接矩阵,通过普里姆算法得出的最小生成子树是什么?

7.(选作)若是使用克鲁斯卡尔算法,课本第109页图6-10生成的最小子图应该是什么?

8.(选作)若是使用克鲁斯卡尔算法,(图1)生成的最小子图应该是什么?

时间: 2024-08-25 13:45:01

实验六 最小代价生成树的相关文章

TZOJ 5471: 数据结构实验--图的最小代价生成树

题目描述 求带权无向图的最小代价生成树. 输入 输入数据为多组,每组数据包含多行,第一行为2个整数n,e,n为图的顶点数,e为边数,接下来是e行,每行3个整数,前两个整数是一个顶点对,代表一条边所依附的两个顶点,第3个整数是边的权值. 所有值不超过20. 输出 请使用prim算法生成一棵生成树,并输出为生成树的各条边及其权值.格式见样例. 样例输入 5 71 2 11 3 12 3 42 4 22 5 13 4 54 5 6 样例输出 1 2 11 3 12 5 12 4 2 PS:太惭愧了,写

最小代价生成树(数据结构)

1 //最小代价生成树 2 //prim算法(稠密图):从与这棵树相连的边中选择最短的边,并将这条边及其所连顶点接入当前树中 3 void Prim(MGraph g,int v0,int &sum) { 4 int lowcost[maxsize],visit[maxsize],v;//lowcost存放当前树到其他顶点的最小权值的顶点 5 int min,k; 6 v=v0; 7 for(int i=0; i<g.n; i++) { 8 lowcost[i]=g.edges[v0][i]

[数据结构] 最小(代价)生成树

在说明最小生成树之前,先重温一下其他的几个概念. 连通图:任意两个顶点都有路径相通的无向图,称为连通图.(注意不是边,而是路径) 强连通图:任意两个顶点都有路径相通的有向图,称为强连通图. 网:图的边具有一定的意义,每条边都对应着一个数据,称为权,这种图被称为网. 连通网,同理. 最小生成树 生成树:从一个连通图中拆出一棵连通子图,它包含了所有的顶点,但只保留了足以构成一棵树的边(N-1条边,N为顶点个数). 最小生成树:对于连通网而言的,所有边的代价之和最小(权的总和最小)的生成树,就是最小生

最小代价生成树

#include<iostream> using namespace std; const int Max = 100; int p[Max][Max]; const int maxCost = 99; int lowcost[Max]; int nearest[Max]; bool mark[Max]; void Prime(int k,int n) { memset(lowcost, 99, sizeof(lowcost)); memset(nearest, -1, sizeof(near

1130. 叶值的最小代价生成树

1.dp 1 int mctFromLeafValues(vector<int>& arr) { 2 int len = arr.size(); 3 vector<vector<int>> rmq(len, vector<int>(len, 0)); 4 for (int i = 0; i < len; i++) 5 rmq[i][0] = arr[i]; 6 for (int j = 1; (1<<j)<len ; j++)

kuangbin带你飞 生成树专题 : 次小生成树; 最小树形图;生成树计数

第一个部分 前4题 次小生成树 算法:首先如果生成了最小生成树,那么这些树上的所有的边都进行标记.标记为树边. 接下来进行枚举,枚举任意一条不在MST上的边,如果加入这条边,那么肯定会在这棵树上形成一个环,如果还要维护处树的特点 那么就要在这个环上删去一条边,这样他还是树,删掉的边显然是这条链上权值最大边更可能形成次小生成树.那么就有2中方法可以做. 第一种PRIM在prim时候直接可以做出这个从I到J的链上权值最大的值MAX[i][j]; 同时可以用kruskal同样方式标记树边,然后DFS跑

Cisco PT模拟实验(5) 交换机的生成树协议配置

Cisco PT模拟实验(5) 交换机的生成树协议配置 实验目的: 理解生成树协议工作原理 掌握快速生成树协议RSTP的基本配置方法 实验背景:公司财务部和销售部的PC通过2台交换机实现通信,为提高网络可靠性,冗余链路是一个不错的思路,可防止因某条链路故障导致整个网络的中断,但冗余拓扑存在网络环路等一系列问题,为此需要在交换机上做适当配置. 技术原理: 生成树协议:监视二层交换式网络以找出所有可用的链路,并关闭冗余链路以确保不会出现环路. 首先利用生成树算法创建一个拓扑数据库,然后将网络的冗余备

20182308 2019-2020-1 《数据结构与面向对象程序设计》实验六报告

学号 2019-2020-1 <数据结构与面向对象程序设计>实验六报告 课程:<程序设计与数据结构> 班级: 1823 姓名: 华罗晗 学号:20182308 实验教师:王志强 实验日期:2019年10月21日 必修/选修: 必修 1.实验内容 1.链表练习,要求实现下列功能: 通过键盘输入一些整数,建立一个链表: 这些数是你学号中依次取出的两位数. 再加上今天的时间. 例如你的学号是 20172301 今天时间是 2018/10/1, 16:23:49秒 数字就是 20, 17,

软件测试实验六

请用所学的软件测试知识和技术方法,对bookstore项目中的购物车模块进行测试,并写出测试的缺陷报告. 说明: 1.bookstore项目即实验7发给大家的项目 2.要求至少发现2个缺陷,即要写2份缺陷报告 3.缺陷报告参考课本P264页 4.缺陷报告中的严重度和优先级按照课本P263页中规定的严重度和优先级 5.页面布局.美观.链接等不符合需求,也算缺陷,但本题请不要写这些方面的缺陷,否则不给分. 购物车模块缺陷报告 缺陷编号:01.01.01