码迷,mamicode.com
首页 > 其他好文 > 详细

Floyd杂记

时间:2019-08-03 12:59:57      阅读:60      评论:0      收藏:0      [点我收藏+]

标签:i+1   code   问题   统计   lin   矩阵   for   std   矩阵快速幂   

最小环

分有向图和无向图。

有向图很简单:直接建边然后跑\(Floyd\),跑完以后,\(dis(i,i)\)就是经过\(i\)点的最小环的长度。

无向图……就是在以\(k\)为中间点扩展之前就把\(k\)拿进去统计

像这样:

for(int k=1;k<=n;k++)
{
    for(int i=1;i<k;i++)
        for(int j=i+1;j<k;j++)
            minr=std::min( minr,dis[i][j]+e[i][k]+e[j][k] );
    
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            dis[i][j]=std::min( dis[i][j],dis[i][k]+dis[k][j] );
}

矩阵

这个挺有意思。

有这样一个问题:求\(S\)\(T\)经过\(k\)条边的最短路。

如果\(N\)能够接受\(O(n^3)\)的算法,那么\(Floyd\)就派上用场了。

如果\(A\)矩阵和\(B\)矩阵分别表示经过\(x\)条边和\(y\)条边的矩阵,那么新的矩阵\(C=A\times B\)就是经过\(x+y\)条边的矩阵。

JZ res;

for(int i=1;i<=idx_cnt;i++)
    for(int s=1;s<=idx_cnt;s++)
        for(int t=1;t<=idx_cnt;t++)
            res.a[s][t]=std::min( res.a[s][t],a[s][i]+op.a[i][t] );

return res;

和普通的\(Floyd\)算法不同的是,在这里,等式两边的矩阵是相互独立的。也就是说,\(C\)矩阵中的\(dis\)不会对\(A\)\(B\)当中的产生影响,所以\(C\)矩阵是切切实实只表示\(x+y\)条边的矩阵。

\(Floyd\)算法中,用\(1\)条边的信息统计完\(2\)条边的信息之后,\(2\)条边的信息又要马上在\(dis\)数组里面用来统计\(3\)条、\(4\)条边的信息,所以不是独立的。

知道具体含义之后就可以用矩阵快速幂了:-)

Floyd杂记

标签:i+1   code   问题   统计   lin   矩阵   for   std   矩阵快速幂   

原文地址:https://www.cnblogs.com/info---tion/p/11294260.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!