zoukankan      html  css  js  c++  java
  • 任意两点最短路径 最短路之floyd

    本人水平有限,题解不到为处,请多多谅解

    本蒟蒻谢谢大家观看

    floyd算法:

    设D[k,i,j]表示“经过若干个编号不超过k的节点” 从i到j的最短路径长度

    D[k,i,j]=min(D[k-1,i,j],D[k-1,i,k]+D[k-1,k,j]);

    初始为D[0,i,j]=A[i,j];A为邻接矩阵

    设有向图G=(V,E),V为点集,E为边集,(x,y)表示一条从x到y的有向图,其边权(或称长度)为W(x,y)。设n=|V|,m=|E|,邻接矩阵A是一个n*n的矩阵。

    A的定义如下:

    A[i,j]={  0   i=j

         w(i,j)  (i,j)属于E

         +∞   (i,j)不属于E

        }

    所以k为阶段,所以必须置于最外层循环中

    省略k这一维之后的DP

    D[i,j]=min(D[i,k]+D[k,j]);

    最终D[i,j]为i到j的最短路径长度

     模板如下:

    code:

     1 #include<bits/stdc++.h>
     2 #pragma GCC optimize(3)
     3 
     4 using namespace std;
     5 int n,m;
     6 int f[310][310];
     7 inline int read(){
     8     int x=0,f=1;char ch=getchar();
     9     while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    10     while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    11     return x*f;
    12 }
    13 inline void write(int x)
    14 {
    15     if(x<0)x=-x,putchar('-');
    16     if(x>9)write(x/10);
    17     putchar(x%10+'0');
    18 }
    19 int main()
    20 {
    21     memset(f,0x3f,sizeof(f));//初始距离最大 
    22     for(int i=1;i<=n;i++)f[i][i]=0;//自己到自己的距离为0 
    23     n=read(),m=read();
    24     for(int i=1,x,y,z;i<=m;i++){
    25         x=read(),y=read(),z=read();
    26         f[x][y]=min(f[x][y],z);//建邻接矩阵 
    27     }
    28     for(int k=1;k<=n;k++){
    29         for(int i=1;i<=n;i++){
    30             for(int j=1;j<=n;j++){
    31                 f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
    32             }
    33         }
    34     }
    35     return 0;
    36 }

    应用:

    传递闭包

    code:

     1 #include<bits/stdc++.h>
     2 #pragma GCC optimize(3)
     3 
     4 using namespace std;
     5 int n,m;
     6 bool f[310][310];
     7 inline int read(){
     8     int x=0,f=1;char ch=getchar();
     9     while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    10     while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    11     return x*f;
    12 }
    13 inline void write(int x)
    14 {
    15     if(x<0)x=-x,putchar('-');
    16     if(x>9)write(x/10);
    17     putchar(x%10+'0');
    18 }
    19 int main()
    20 {
    21     for(int i=1;i<=n;i++)f[i][i]=1; 
    22     n=read(),m=read();
    23     for(int i=1,x,y,z;i<=m;i++){
    24         x=read(),y=read(),z=read();
    25         f[x][y]=f[y][x]=1;
    26     }
    27     for(int k=1;k<=n;k++){
    28         for(int i=1;i<=n;i++){
    29             for(int j=1;j<=n;j++){
    30                 f[i][j]|=f[i][k]&f[k][j];
    31             }
    32         }
    33     }
    34     return 0;
    35 }
  • 相关阅读:
    字典序产生全排列
    python学习1 ---range()函数
    <第一周>降维
    <第一周> city中国城市聚类 testdata学生上网聚类 例子
    Python数据分析与展示[第三周](pandas数据类型操作)
    Python数据分析与展示[第三周](pandas数据特征分析单元8)
    第一周<单元一聚类>
    第一周<导学>
    总体<导学>
    Python数据分析与展示[第三周](pandas简介与数据创建)
  • 原文地址:https://www.cnblogs.com/nlyzl/p/11770430.html
Copyright © 2011-2022 走看看