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,但某蒟蒻就不写了,懒。。。

  • 相关阅读:
    MFC线程(二):线程同步临界区CRITICAL SECTION
    自定义消息
    Visual C++线程同步技术剖析:临界区,时间,信号量,互斥量
    //解析数据函数指针,很爽
    CListCtrl使用方法汇总
    进度条的使用 Progress控件
    CListBOX 用法
    文件操作总结
    CString 十六进制转二进制
    Numpy常用数据结构、数据清洗函数、数据结构series和方法、数据结构dataframe和方法
  • 原文地址:https://www.cnblogs.com/RW-wbd/p/12562552.html
Copyright © 2011-2022 走看看