• Floyed


    1.定义

      可解任意两点间的最短路径

            可判有向图或负权的最短路径问题,也可用于计算有向图的传递闭包

    2.算法描述

        简单点说,就是暴力遍历

        时间复杂度O(n^3)

    下面是简简单单的代码:

    #include <cstdio>
    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;
    }

    下面是可以判断负环的代码:

    #include<iostream>
    #include<cstring>
    using namespace std;
    
    #define inf 0x3f3f3f3f
    #define maxn 555
    int mmp[maxn][maxn];
    int x,y,z,t,n,w,m;
    
    bool floyd()
    {
        for(int k=1; k<=n; k++)
            for(int i=1; i<=n; i++)
            {
                for(int j=1; j<=n; j++)
                {
                    if(mmp[i][k]+mmp[k][j]<mmp[i][j])
                        mmp[i][j]=mmp[i][k]+mmp[k][j];
                }
                if(mmp[i][i]<0)
                    return 1;
            }
        return 0;
    }
    
    int main()
    {
        cin>>t;
        while(t--)
        {
            memset(mmp,inf,sizeof(mmp));
            cin>>n>>m>>w;
            for(int i=1; i<=n; i++)
                mmp[i][i]=0;
            while(m--)
            {
                cin>>x>>y>>z;
                if(z<mmp[x][y])
                {
                    mmp[x][y]=z;
                    mmp[y][x]=z;
                }
            }
            while(w--)
            {
                cin>>x>>y>>z;
                mmp[x][y]=-z;
            }
            if(floyd())
                cout<<"YES"<<endl;
            else
                cout<<"NO"<<endl;
        }
        return 0;
    }

      

  • 相关阅读:
    CSS3 实现六边形Div图片展示效果
    自己编写jQuery插件 之 放大镜
    自己编写jQuery插件 之 无缝滚动
    C#装箱拆箱
    C#基础知识
    数据库锁
    SQL2008中Merge的用法
    SQl去获取相同记录
    判断DataRow中是否包含某列
    Quartz中时间表达式的设置-----corn表达式
  • 原文地址:https://www.cnblogs.com/darlingroot/p/10554217.html
Copyright © 2020-2023  润新知