倍增Floyd「建议收藏」

倍增Floyd有这样的一道题:给定一张图,求其中恰好经过mm条边的路径的长度最小值。(n<=200,m<=109)(n<=200,m<=10^9)对于这种题型,可以使用倍增Floyd求解。由于Floyd算法的奇特性质:每次加入一个点进行更新。如果我们把它改写为:for(inti=0;i<=n;i++)for(intj=0;j<=n;j++)for(intk=

大家好,又见面了,我是你们的朋友全栈君。

有这样的一道题:

给定一张图,求其中恰好经过 m 条边的路径的长度最小值。

(n<=200,m<=109)

对于这种题型,可以使用倍增Floyd求解。

由于Floyd算法的奇特性质:每次加入一个点进行更新。如果我们把它改写为:

for(int i=0;i<=n;i++)
    for(int j=0;j<=n;j++)
        for(int k=0;k<=n;k++)
            check(d[i][j],d[i][k]+d[k][j]);

那么这得到的就是经过两条边的最短距离的,同样的,我们就可以将这个拓展为倍增,就可以解决这个问题了。附上部分代码。

(黄学长的代码写的真飘逸,学习了)

struct Floyd{
    int d[N][N];
    Floyd(){
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                d[i][j]=INF;
    }
    Floyd operator *(const Floyd &a)const{
        Floyd res;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                for(int k=1;k<=n;k++)
                    check(res.d[i][j],d[i][k]+a.d[k][j]);
        return res;
    }
}ans,A;
void solve(){
    Init();//A设为原图
    while(m){
        if(m&1)ans=ans*A;
        A=A*A;
        m>>=1;
    }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/127096.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 数据库查询常用语句语法

    数据库查询常用语句语法selectxxfrom表格where内容=””检查一个项目是否在列表中可以用in列表,用(‘’,’’,’‘)单引号分隔开名字不在里面namenotin(‘’,‘‘,‘‘)名字在里面namein(‘’,‘‘,‘‘)andorname=’Argentina’orname=’Australia’等同于nameinIN(‘Argentina’,’Australia’)betweenxxandyy…

    2022年4月30日
    40
  • oracle创建索引和删除索引

    oracle创建索引和删除索引创建CREATEINDEXindex_Trans_list(索引名)ONTrans_list(表名) (receivedepid(字段名))删除dropindexindex_Trans_list(索引名)

    2025年9月14日
    11
  • 怎样将Sublime Text 设置成中文版(完整教程)「建议收藏」

    怎样将Sublime Text 设置成中文版(完整教程)「建议收藏」1.打开SublimeText,使用快捷键Shift+Ctrl+P,弹出查找栏,如图:2.在搜索框中输入关键字install,出现下拉选项,选择其中的:PackageControl:InstallPackage,如图:(PS:…

    2022年7月11日
    17
  • 初学区块链

    初学区块链原文引自http://www.sohu.com/a/224495010_358377初学区块链区块链解决了什么问题比特币的诞生比特币的转账比特币的制造:区块链与挖矿公钥私钥钱包比特币之间的关系比特币——账本而已比特币转账——签名认证:hash算法区块、hash、挖矿区块链的形成及小总结双花问题2140年后,记账没有奖励了,系统如何进行区块链技术引领未来区块链解决了什么问题我们从区块链…

    2022年5月28日
    48
  • java中break与continue区别_brake和break怎么区别

    java中break与continue区别_brake和break怎么区别前段时间学Java时,在break与continue上的理解与应用总觉得欠点什么,虽说也能模模糊糊地掌握,可深度总是不够,心里边也总是不那么亮堂。现在学JavaScript时见到一个不错的例子,现在把它总结下。continue时,跳出本次循环,继续执行下次循环。For(inti=0;i<=5;i++){If(i==3)continue;System.out.println("T

    2022年5月3日
    80
  • 实现一个单向链表_java链表添加

    实现一个单向链表_java链表添加链表是常用的一种数据结构,如何创建链表、增、删、查找等功能是本文讨论的内容。首先,链表需要两个指针,一个是头指针是固定不变的,一个是移动变化的指针。(1)为什么要头指针?原因是单向列表中的数据结构包含的只有下一个数据的指针,这样就说明了,单向链表是不可逆向进行操作。所有的操作都需要正向去操作。这时我们必须要知道第一个数据的地址,才能从第一个数据往后访问其他数据。(2)可移动的指针的作用有两个,一个…

    2025年7月25日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号