zoukankan      html  css  js  c++  java
  • 最短路径(随便写写)(Floyd,Bellman-Ford,Dijkstra)

    3种常用的最短路径算法

    最初学的算法之一,(之3),好怀念啊

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,p;
    int dis[1000],f[1000][1000],k,ans,minn=1e9,v,b,w;
    bool t[1000];
    
    void input1()
    {
        cin>>n>>m>>p;
        memset(dis,0x7f,sizeof(dis));
        memset(f,0x7f,sizeof(f));
        memset(t,0,sizeof(t));
        dis[p]=0;
        t[p]=true;
        for(int i=1;i<=m;i++)
        {
            cin>>v>>b>>w;
            f[i][i]=0;
            f[v][b]=f[b][v]=w;
        }
        for(int i=1;i<=n;i++)
        dis[i]=min(dis[i],f[p][i]);
    }
    void dijkstra()
    {
        for(int i=1;i<=n-1;i++)
        {
            minn=1e9;
            k=0;
            for(int i=1;i<=n;i++)
            {
                if(!t[i]&&dis[i]<minn)
                {
                    minn=dis[i];
                    k=i;
                }
            }
            if(k==0) break;
            t[k]=true;
            for(int i=1;i<=n;i++)
            if(i!=k)
            dis[i]=min(dis[i],dis[k]+f[k][i]);
        }
        for(int i=1;i<=n;i++)
        cout<<i<<' '<<':'<<' '<<dis[i]<<endl;
    }
    void text1_dijkstra()
    {
        input1();
        dijkstra();
    }
    
    struct ed
    {
        int from;
        int next;
        int weight;
    } edge[1000];
    void input2()
    {
        cin>>n>>m>>p;
        memset(dis,0x7f,sizeof(dis));
        dis[p]=0;
        for(int i=1;i<=m;i++)
        {
            cin>>edge[i].from>>edge[i].next>>edge[i].weight;
            if(edge[i].from==p) dis[edge[i].next]=edge[i].weight;
        }
    }
    void relax(int u1,int v1,int w1)
    {
        if(dis[v1]>dis[u1]+w1)
        dis[v1]=dis[u1]+w1;
    }
    int bellman_ford()
    {
        for(int i=1;i<=n-1;i++)
        for(int j=1;j<=m;j++)
        relax(edge[j].from,edge[j].next,edge[j].weight);
        bool fool=false;
        for(int i=1;i<=m;i++)
        if(dis[edge[i].from]>dis[edge[i].next]+edge[i].weight)
        {
            fool=true;
            break;
        }
        if(!fool)
        for(int i=1;i<=n;i++)
        cout<<i<<' '<<':'<<' '<<dis[i]<<endl;
    }
    void text2_bellman_ford()
    {
        input2();
        bellman_ford();
    }
    
    void input3()
    {
        cin>>n>>m>>p;
        for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        f[i][j]=1e8;
        for(int i=1;i<=m;i++)
        {
            cin>>v>>b>>w;
            f[i][i]=0;
            f[v][b]=f[b][v]=w;
        }
    }
    void floyd()
    {
        for(int k=1;k<=n;k++)
        {
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=n;j++)
                {
                    if(i!=k&&i!=j&&j!=k)
                    f[i][j]=min(f[i][k]+f[k][j],f[i][j]);
                }
            }
        }
        for(int i=1;i<=n;i++)
        if(i!=p)
        cout<<i<<' '<<':'<<' '<<f[p][i]<<endl;
    }
    void text3_floyd()
    {
        input3();
        floyd();
    }
    
    int main()
    {
        //text1_dijkstra();//迪杰斯特拉算法 
        //text2_bellman_ford();//贝尔曼-福特算法
        //text3_floyd();//弗洛伊德算法
        return 0;
    }

    ps(这里的Bellman-Ford是处理有向图的,处理无向图只需将input2的循环里加上if(edge[i].next==p) dis[edge[i].from]=edge[i].weight;)

    虽然还有许多其他算法,比如说SPFA,但某蒟蒻就不写了,懒。。。

  • 相关阅读:
    POJ 1953 World Cup Noise
    POJ 1995 Raising Modulo Numbers (快速幂取余)
    poj 1256 Anagram
    POJ 1218 THE DRUNK JAILER
    POJ 1316 Self Numbers
    POJ 1663 Number Steps
    POJ 1664 放苹果
    如何查看DIV被设置什么CSS样式
    独行DIV自适应宽度布局CSS实例与扩大应用范围
    python 从入门到精通教程一:[1]Hello,world!
  • 原文地址:https://www.cnblogs.com/RW-wbd/p/12562552.html
Copyright © 2011-2022 走看看