3算法设计与分析(第三章)

  • 格式:ppt
  • 大小:546.51 KB
  • 文档页数:59

下载文档原格式

  / 59
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

11
Prim算法的实现
• Prim(int n, Type **c) {
int j = 1; s[j] = true; for (int i = 2; i <= n; i++) { s[i]=false; closest[i] = 1; lowcost[i]=c[1][i];}
for (int i = 1; i < n; i++) {min= inf;
G–e不连通。 • n个顶点的连通图的生成树含有n – 1条边。
2019/9/14
计算计算法设计与分析
3
求最小生成树的思路
• 一个很直观的简单想法:依次选出依据图G 的权重较轻的n – 1条边。这样得到的n – 1 条边的权重之和肯定是最小的。但是这样 是否就得到了G的一棵最小生成树呢?
• 不行!因为不能保证这n – 1条边构成树? • 怎样才能保证这n – 1条边构成树呢?
Kruskal算法的做法
2019/9/14
计算计算法设计与分析
5
Prim算法
• 基本思想:设G=(V, E)为无向连通带权图, 令V={1, …, n}。在保证连通的前提下依次 选出权重较小的n – 1条边。
• 设置一个集合S ,初始化S = {1},T = 。
• 如果V–S中的顶点j与S中的某点i连接且(i, j) 是E-T中的权重最小的边,于是就选择j(将j 加入S),并将(i, j) 加入T中 。
调整lowcost[]和closest[];
}
2019/9/14
计算计算法设计与分析
8
Prim算法的实现

Prim(int n, Type **c) { int j = 1; s[j] = true;
其余结将点结都点不1放在入S中S中且与S的 最近距离是与结点1的距离。
for (int i = 2; i <= n; i++) {
称为G的最小(优)生成树。
2019/9/14
计算计算法设计与分析
2
树的基本性质
• 连通无回路的图G称为树。 • 树是点比边多一且连通, q=p–1且连通 。 • 树是点比边多一且无回路: q=p–1且无回路。 • 树若添条边就有回路:G无回路,若u, vG且
uv E(G),则G+uv中恰有一条回路。 • 树若减条边就不连通:G连通,对e∈E(G),
for (int k = 2; k <= n; k++) if (lowcost[k]<min&&!s[k]) {min = lowcost[k]; j = k} s[j] = true;
先将依最据小lo值w设co为st[∞]找。出与S 最近的点j并放入S。
for (int i = 2; i <= n; i++) {
s[i]=false; closest[i] = 1; lowcost[i]=c[1][i];}
for (int i = 1; i < n; i++) {min = inf;
• Prim(int n, Type **c) {
int j = 1; s[j] = true; for (int i = 2; i <= n; i++) { s[i]=false; closest[i] = 1; lowcost[i]=c[1][i];}
for (int i = 1; i < n; i++) {min= inf;
for (int k = 2; k <= n; k++) {
if (lowcost[k] < min&&!s[k]) {min = lowcost[k]; j = k} s[j] = true;
调整lowcost[]和closest[];
}
2019/9/14
计算计算法设计与分析
10
Prim算法的实现
for (int k = 2; k <= n; k++) if (lowcost[k]<min&&!s[k]) {min = lowcost[k]; j = k} s[j] = true;
s中仅加入了一个新成员j,因此只需要依据结 点j调整lowcost[]和closest[];
2019/9/14
计算计算法设计与分析
第三章
贪心算法
2019/9/14
计算计算法设计与分析
1
最小生成树
• 设G = (V, E)是无向连通带权图,即一个网 络。E的每条边(v, w)的权为c[v][w]。
• 如果G的一个子图G’是一棵包含G的所有 顶点的树,则称G’为G的生成树。
• 生成树各边权的总和称为其耗费。 • 在G的所有生成树中,耗费最小的生成树
• 生成树是含有n个顶点和n – 1条边的连通并且 无回路的图。
2019/9/14
计算计算法设计与分析
4
求最小生成树的两种策略
• 策略一:在保证连通的前提下依次选出权重
较小的n – 1条边(在实现中体现为n个顶点的
选择)。
Prim算法Байду номын сангаас做法
• 策略二: 在保证无回路的前提下依次选择权 重较小的n – 1条边。
s[i]=false; closest[i] = 1; lowcost[i] = c[1][i];}
执行以下操作n–1次:
依据lowcost[]找出与S最近的点j并放入S;
调整lowcost[]和closest[];
}
2019/9/14
计算计算法设计与分析
9
Prim算法的实现
• Prim(int n, Type **c) { int j = 1; s[j] = true;
• 重复执行贪心策略,直至V–S为空。
2019/9/14
计算计算法设计与分析
6
Prim算法中的数据结构
• 图用连接矩阵C[i][j]给出,即C[i][j]为结点i 到结点j的权重。
• 为了有效地找出V–S中满足与S中的某个点i 连接且(i, j) 权重最小的顶点j,对其中每个 顶点j设立两个数组closest[j]和lowcost[j]:
• closest[j]是s中与j最近的顶点,(closest[j], j) 即为选中的边,而lowcost[j]是相应这条边 的权重。
2019/9/14
计算计算法设计与分析
7
Prim算法的实现
• Prim(int n, Type **c) { 初始化:结点1放入S;并初始化lowcost[]和 closest[]; 执行以下操作n–1次: 依据lowcost[]找出与S最近的点j并放入S;