• Floyd多源最短路算法


    其实没什么好说的,从点 i 到点 j ,除了直接一条边连接直通还可以通过别的边中转得到,这样就得到了一个类似dp的一个状态转移方程。但是注意:1.Floyd必须用邻接矩阵存图。2.不能解决负环问题。

    #include <bits/stdc++.h> 
    using namespace std;
    int main()  
    {  
        int e[10][10],k,i,j,n,m,t1,t2,t3;  
        int inf=99999999; //用inf(infinity的缩写)存储一个我们认为的正无穷值
        //读入n和m,n表示顶点个数,m表示边的条数
        scanf("%d %d",&n,&m);  
        //初始化
        for(i=1;i<=n;i++)  
            for(j=1;j<=n;j++)  
                if(i==j) e[i][j]=0;//自己到自己当然不需要任何代价    
                else e[i][j]=inf;//其它没有直通边的都赋值为正无穷  
        //读入边
        for(i=1;i<=m;i++)  
            {  
                scanf("%d %d %d",&t1,&t2,&t3);  
                e[t1][t2]=t3;//邻接矩阵存图  
            }  
        //Floyd-Warshall算法核心语句
        for(k=1;k<=n;k++)  
            for(i=1;i<=n;i++)  
                for(j=1;j<=n;j++)  
                    if(e[i][j]>e[i][k]+e[k][j] )   
                        e[i][j]=e[i][k]+e[k][j];  
         //输出最终的结果
        for(i=1;i<=n;i++)  
        {  
            for(j=1;j<=n;j++) 
                printf("%10d",e[i][j]);  
            printf("
    ");  
        }  
        return 0;  
    }  

    例题:洛谷P2910

    代码(第一次自己写floyd就成功了):

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    using namespace std;
    int n,m,ans;
    int a[10010],d[110][110],f[110][110];
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
        while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
        return x*f;
    }
    void floyd()
    {
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                f[i][j]=d[i][j];
        for(int k=1;k<=n;k++)
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                    f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
    }
    int main()
    {
        n=read();
        m=read();
        for(int i=1;i<=m;i++)
            a[i]=read();
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                d[i][j]=read();
        floyd();
        for(int i=1;i<=m-1;i++)
            ans+=f[a[i]][a[i+1]];
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    HDU 5115 Dire Wolf ——(区间DP)
    2016 ICPC 大连网络赛 部分题解
    CodeForces 707D Persistent Bookcase ——(巧妙的dfs)
    HDU 5806 NanoApe Loves Sequence Ⅱ ——(尺取法)
    【Permutations II】cpp
    【Permutations】cpp
    【Subsets II】cpp
    【Subsets】cpp
    【Search a 2D Matrix】cpp
    【Search Insert Position 】cpp
  • 原文地址:https://www.cnblogs.com/57xmz/p/13204110.html
Copyright © 2020-2023  润新知