第15讲:图和其应用.ppt

  1. 1、本文档共74页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
4、素数链 设计程序将1。。。n(20)排成一排,使任意两个相邻的数的和为素数。第1个和最后一个的和也为素数. 输出:第一个数为1. 四、无向图的传递闭包 判断无向图的连通性 1 2 3 4 6 5 7 输入图的边的信息,输出各点的连通行。 输入: 7 1 2 2 3 1 3 3 4 5 6 6 7 输出: 1 1 1 1 0 0 0 1 1 1 1 0 0 0 1 1 1 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 1 1 0 0 0 0 1 1 1 0 1 1 0 0 0 0 1 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 邻接矩阵 判断结点 i 和 j的连通性: i j k 1、结点i和j如果原来有边则连通。 2、如果i和j之间没有边: 如果存在另外的一个结点k,满足:i与k连通,k与j连通,则i与j连通。 否则i和j不连通。 Can[ i , j ]: true ,i与j之间有边;false:无边。 则:Can[ i , j ]=can[ i , j] or ( can[ i , k ] and can[ k , j ]) for k:=1 to n do for i:=1 to n do for j:=1 to n do can[i,j]:=can[i,j] or (can[i,k] and can[k,j]); 过程: 产生数 【问题描述:】   给出一个正整数 n(n10^50) 和 k 个变换规则(k=15)。每个变换规则是指:    一位数可变换成另一个一位数:规则的右部不能为零。   例如:n=234。有规则(k=2):     2- 5 3- 6   上面的整数 234 经过变换后可能产生出的整数为(包括原数):    234 534 264 564 共 4 种不同的产生数。 【任务:】   给出一个整数 n 和 k 个变换规则。 求经过任意次的变换(0次或多次),能产生出多少个不同整数。仅要求输出个数。 【输入:】 第一行:n。第二行:k。以下k行:每行两个一位数:x y,中间一个空格,表示一个变换规则:x可以变为y。 【输出:】 一个整数(满足条件的个数): 【输入样例:】 234 2 2 5 3 6 【样例输出:】 4 应用举例 ?本题搜索显然是不行的。 ?对于只需计数而不需求具体方案的题目,一般都不会用搜索解决。 分析: ?乘法原理直接进行计数。 用F[i]表示数字i包括本身可以变成的数字总个数 这里的变成可以是直接变成也可以是间接变成: 比如 3-5, 5-7,那么 3-7 那么对于一个数a(用数组存,长度为n),根据乘法原理它能产生出不同整数数量: F[a[1]]*F[a[2]]*F[a[3]]*…F[a[n]] [引例]: 现在,我们想从城市A到达城市E。 怎样走才能使得路径最短,最短路径的长度是多少? 1 2 3 4 5 6 7 8 9 10 11 5 3 1 6 3 8 4 3 8 5 5 6 3 4 3 五、图的最短路径 已知各个城市之间的道路情况如下: 图中两点间的最短距离。 两类问题: 1、图中每对顶点(任意两点)之间的最短路径 (弗洛伊德算法:floyed)。 2、图中一个顶点到其他顶点的最短路径 (迪杰斯特拉算法:dijkstra)。 一)、计算每一对顶点间的最短路径(floyd算法) 目标:把图中任意两点i与j之间的最短距离都求出来 d[I,j]。 原理:根据图的传递闭包思想: i j k if d[I,k]+d[k,j]d[I,j] then d[I,j]=d[I,k]+d[k,j] for k:=1 to n do for i:=1 to n do for j:=1 to n do if d[i,k]+d[k,j]d[i,j] then d[i,j]:=d[i,k]+d[k,j]; 算法写法1:floyed2.pas 初始化条件: D[ i, i ]=0 //自己到自己为0;对角线为0; D[I,j]=边权,i与j有直接相连的边 D[I,j]= +∞ ,i与j无直接相连的边。 // 一般设为: maxint or maxlongint; 举例: 已知下图中给定的关

文档评论(0)

kehan123 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档