C04-图论算法.pptVIP

  1. 1、本文档共120页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C04-图论算法.ppt

例4.8 城市公交网建设问题 【输入格式】   第一行为整数n(城市数,1≤N ≤100)和e(边数)。   以下e行,每行3个数i,j,wij,表示在城市i,j之间修建高速公路的造价。 【输出格式】   n-1行,每行为两个城市的序号,表明这两个城市间建一条高速公路。 【输入样例】   5 8   1 2 2   2 5 9   5 4 7   4 1 10   1 3 12   4 3 6   5 3 3   2 3 8 【输出样例】   1 2   2 3   3 4   3 5 2 4 1 5 3 9 2 10 8 12 7 6 3 最小生成树——Prim算法 Prim算法采用与Dijkstra算法一样的“蓝白点”思想:白点代表已经进入最小生成树的点,蓝点代表未进入最小生成树的点 采用贪心算法,每次选择一个蓝点变为白点,即每次选择一点加入最小生成树中 选择的标准:与白点相连的边权最小的蓝点 算法复杂度:O(n2) 最小生成树——Prim算法 选择边权最小的蓝点1变为为白点 更新蓝点与白点相连的最小边权 2 4 1 5 3 9 2 10 8 12 7 6 3 0 2 12 10 ∞ 2 4 1 5 3 9 2 10 8 12 7 6 3 0 ∞ ∞ ∞ ∞ 初始化:所有的点为蓝点 蓝点1与白点相连的最小边权为0 其它蓝点与白点相连的最小边权为∞ 2 4 1 5 3 9 2 10 8 12 7 6 3 0 2 8 10 9 选择边权最小的蓝点2变为白点 更新蓝点与白点相连的最小边权 选择边权最小的蓝点5变为白点 更新蓝点与白点相连的最小边权 2 4 1 5 3 9 2 10 8 12 7 6 3 0 2 8 6 3 2 4 1 5 3 9 2 10 8 12 7 6 3 0 2 8 6 3 选择边权最小的蓝点3变为白点 更新蓝点与白点相连的最小边权 2 4 1 5 3 9 2 10 8 12 7 6 3 0 2 8 6 3 选择边权最小的蓝点2变为白点 所有点变为白点,算法结束 最小生成树——Prim算法 查找与白点相连权值最小的蓝点k 将k标为白色,更新与k相连的所有蓝点 所有点都变为白点 结束 N Y for i:=1 to n do begin u[i]:=true; min[v]:=maxlongint; end; min[1]:=0; k:=0; for i:=1 to n do if u[i] and (min[i]min[k]) then k:=i; u[k]:=false; for j:=1 to n do if u[j] and (min[j]w[k,j]) then min[j]:=w[k,j]; 标记所有点为蓝点, 蓝点1最小边权为0 其它蓝点最小边权为∞   这个流程得出了最小生成树结点的加入过程   如果要记录最小生成树的边,可增加一个一维数组pre[i],记录结点i为蓝点时,边权最小的相连白点 例4.9 最优布线问题 学校有n台计算机,为了方便数据传输,现要将它们用数据线连接起来。两台计算机被连接是指它们之间有数据线连接。由于计算机所处的位置不同,因此不同的两台计算机的连接费用往往是不同的。 当然,如果将任意两台计算机都用数据线连接,费用将是相当庞大的。为了节省费用,我们采用数据的间接传输手段,即一台计算机可以间接的通过若干台计算机(作为中转)来实现与另一台计算机的连接。 现在由你负责连接这些计算机,的任务是使任意两台计算机都连通(不管是直接的或间接的)。 【输入格式】   输入文件wire.in,第一行为整数n(2≤n≤100),表示计算机的数目。此后的n行,每行n个整数。第x+1行y列的整数表示直接连接第x台计算机和第y台计算机的费用。 【输出格式】   输出文件wire.out,一个整数,表示最小的连接费用。 【输入样例】   3   0 1 2   1 0 1   2 1 0 【输出样例】   2 2 1 3 1 1 2 Program wire; Var g:array[1..100,1..100] of integer; //邻接矩阵 min:array[0..100] of integer; //min[i]存放蓝点i与白点相连的最小边权 u:array[0..100] of boolean; //u[i]表示点i的颜色,true为蓝,false为白 n,i,j,k,total:integer; Begin readln(n); for i:=1 to n do begin for j:=1 to n do read(g[i,j]); readln; end; fillch

文档评论(0)

ggkkppp + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档