课件第13章_初涉acm.pptVIP

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

最后Di中存储的就是最短距离,Pw所标记的为由Freddy顶点到达所有其他顶点的最短路径的序列。 其对应的代码可以描述如下 void Dij(int n) { unsigned int visit[MAX_N]; double D[MAX_N],mind; int P[MAX_N],i,w,minpos,j; for(i=0;in;i++) { visit[i] = 0; D[i] = MAX_DOUBLE; P[i] = 0; } D[0]=0; for(i=0;in;i++) { mind=MAX_DOUBLE; minpos=-1; for(j=0;jn;j++) * { if(!visit[j](minpos==-1||D[j]mind)) { minpos=j; mind=D[j]; } } visit[minpos]=1; printf(%d %.2f\n,minpos,mind); for(w=0;wn;w++) { if(!visit[w]D[w] D[minpos] + road[minpos][w]) { D[w] = D[minpos] + road[minpos][w]; P[w] = minpos; } } } } 表示第minpos号石头直接跳到第w号石头的实际距离) * 问题小结: 以上算法用于解决从单一起点到任意其他顶点的最短路径问题, 被称为是单源最短路径Dijkstra算法,其实还有一种算法,是运用了动 态规划的思想,可以求解任意点对的最短距离,叫做Floyd算法。 * 13.9 青蛙的约会之解与模线性方程 问题描述: 两只青蛙住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止。可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置。不过它们觉得只要一直朝着某个方向跳下去,总能碰到对方的。但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的。为了帮助这两只青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,会在什么时候碰面。 我们把这两只青蛙分别叫做青蛙A和青蛙B,并且规定纬度线上东经0度处为原点,由东往西为正方向,单位长度1米,这样我们就得到了一条首尾相接的数轴。设青蛙A的出发点坐标是x,青蛙B的出发点坐标是y。青蛙A一次能跳m米,青蛙B一次能跳n米,两只青蛙跳一次所花费的时间相同。纬度线总长L米。现在要你求出它们跳了几次以后才会碰面。 * 分析解决问题: 由题意可知,若青蛙A要与青蛙B相遇,则必须满足: x+mC – (y+nC) = kL (k=……-2,-1,0,1,2……) 简化上式,可以得到 (n-m)C+kL = x – y 如果令 a = n – m,b = x-y ,上式可写为 aC ≡ b(mod L) 欧几里得定理:gcd(a,b) = gcd(b,a%b),其中gcd(a,b)表示求解a,b的最大 公约数。现在,令ax + by = gcd(a,b),对于a‘ = b,b’ = a % b而言 ,我们求得 p, q使得a‘p + b’q = Gcd(a‘, b’)由于 b‘ = a % b = a - a / b * b (注:这里的/是程序设计语言中的除法), 我们可以得到: ap + bq = Gcd(a, b) ===bp + (a - a / b * b)q = Gcd(a, b) = Gcd(a, b) ===aq +b(p - a / b*q) = Gcd(a, b) * 其代码描述如下: #include iostream.h int exGcd(__int64 a, __int64 b, __int64 x, __int64 y) { if (b == 0) { x = 1; y = 0; return a; } __int64 r = exGcd(b, a % b, x, y); __int64 t = x; x = y; y = t - a / b * y; return r; } void linear_equation_solver(__int64 a,__int64 b,__int64 n) //解方程ax=b(mod n), 必须保证n是正数 { * __int64 x,y,d; if(a

文档评论(0)

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

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

1亿VIP精品文档

相关文档