zoukankan      html  css  js  c++  java
  • Floyd杂记

    最小环

    分有向图和无向图。

    有向图很简单:直接建边然后跑(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 imes 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)条边的信息,所以不是独立的。

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

  • 相关阅读:
    shell中exec解析
    linux expr命令参数及用法详解
    Linux中变量#,#,@,0,0,1,2,2,*,$$,$?的含义
    Q_DISABLE_COPY
    lower_bound()函数
    滚动数组
    POJ 1159 Palindrome(LCS)
    C语言中short的意思
    ZOJ 2432 Greatest Common Increasing Subsequence(最长公共上升子序列+路径打印)
    ZOJ 1004 Anagrams by Stack(DFS+数据结构)
  • 原文地址:https://www.cnblogs.com/info---tion/p/11294260.html
Copyright © 2011-2022 走看看