zoukankan      html  css  js  c++  java
  • 最短路问题专题

    ///注意:最短路问题均没有使用递归函数。
    /*
    Dijkstra  单源最短路问题 用了一个队列
    Bellman_Ford 单源最短路  暴搜
    Floyd_warshanll  多元最短路问题  dp 直接更新
    
    Dijkstra算法的路径还原*/
    
    
    
    Dijkstra算法
    Bellman_Floyd算法
    Floyd_warshall算法
    
    单源最短路问题  对所有的边进行遍历,更新d的数字
    Bellman——floyd 暴力破解
    ===
    const int MAX_E;
    const int MAX_V;
    const int INF;
    
    struct edge{int from,int to,int cost};
    edge G[MAX_E];
    int d[MAX_V];
    void shortest_path_Bellman_Floyd()
    {
        ======
     int i;int v;int start;int finial;
    for(int i=0;i<v;++i)
    d[i]=INF;
    d[start]=0;
    
    while(true)
    {
        int flag=0;
    
        for(int i=0;i<e;++i)
        {
            edge e=G[i];
           if(a [e.from] !=INF&& d[e.from] +e.cost<d[e.to])///这里稍微去一点枝
            {
                d[ e.to ]=d[ e.from ]+e.cost;
                flag=1;
            }
        }
        if(flag==0) break;
    }
    }
    
    没选过的那些数里面最小的那个就是下一个要去走的
    Dijkstra算法
    ///用重的变量是v 即找到的v的序号以及 v的数量
    
    ===
    const int MAX_E;
    const int MAX_V;
    const int INF;
    
    int d[MAX_V];
    struct edge{int to,int cost};
    vector <edge> G [MAX_V];
    int used[MAX_v];
    void shortese_path_Dijkstra()
    
    int i;int v;int start;int finial;
    for(int i=0;i<v;++i)
    d[i]=INF;
    d[start]=0;
    ===将used初始化为0
    while(true)
    {
         int v1=-1;
        int  min_v=INF;
        ****************
        for(int i=0:i<v;++i)
        {
            if( (!used[i]))
            {
                if(d[i])< min_v {min_v=d[i];v1=i;used[i]=1;} *********别忘记
            }
    
        }
         *****************
        if(v1==-1)  break;
    
        for(int i=0;i<G[v1].size;i++)
        {
            int vv=G[v1][i];
            d[vv.to]=min(d[vv.to],d[v1]+vv.cost);
        }
    
    
    }
    
    Dijkstra算法的第二种实现
    使用队列
    
    const int MAX_E;
    const int MAX_V;
    const int INF;
    typedef pair<int int> pa;
    ///声明成按第一个变量排序的que,从小到大
    
    ///(维护d,将新生成的压进去)
    ///找出来,压进去
    
    
    void shortest_path_Dijkstra2()
    {
        priority_queue<pa,vector<pa>,greater<pa> > que;
        int d[MAX_V];
        int num_v;
        for(int i=0;i<num_v;++i) d[i]=INF; d[start]=0;
        int start;
        int finial;
    
        que.push(pa(0,start));
    
        while(!q.empty())
      {
        pa p=que.top();
        que.pop();
    
        int vertex=p.second;
        for(int i=0;i<v;++i)
        {
            if(d[i]<G[vertex][i]+d[vertex])
             {
    
                 que.push(pa(i,G[vertex][i]+d[vertex]));
                  d[i]= G[vertex][i]+d[vertex];
             }
                     ///压进去就好了
        }
    
      }
    }
    
    从数据结构角度
    ///注意 变量的乱用。。
    B: edge d
    D: G u d
    D2: que  G
    ///感觉上G与G(edge) 功能一样 不过可能更省空间,但代码复杂点。。。
    
    
    /*
    多源最短路问题 dp的思路
    即dp[k][i][j]表示 考虑节点1-k 时从i到j的最短距离
    
    若k是其中一点
    dp[k][i][j]=dp[k-1][i][k]+dp[k-1][k][j]
    */
    int v;
    int e[MAX_V][MAX_V];
    for(int i=0;i<v;++i)
        for(int j=0;j<v;++j)
             if(i=j) dp[i][j]=e[i][j];
      
    ///不是的话dp[k-1][i][j]
    for(int k=0;k<v;++k)
       for(int i=0;i<v;++i)
            for(int j=0;j<v;++j)
                   dp[i][j]=min{dp[i][j],dp[i][k]+dp[k][j]};
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         ]

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         ]

  • 相关阅读:
    zabbix验证微信
    free
    有名管道和无名管道
    shell实现并发控制
    TCP/IP协议簇 端口 三次握手 四次挥手 11种状态集
    自动化运维
    JSON对象(自定义对象)
    对象中属性的遍历、删除与成员方法
    对象间的赋值操作
    自定义类
  • 原文地址:https://www.cnblogs.com/weiweiyi/p/5255381.html
Copyright © 2011-2022 走看看