• Dijkstra最短路径算法


    #include <iostream>
    #include <vector>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    
    using namespace std;
    
    const int  MAXINT = 32767;
    const int MAXNUM = 10;
    int dist[MAXNUM];
    int prev[MAXNUM];
    int len;
    int v00 = 0;
    int A[MAXNUM][MAXNUM];
    
    void input(){
        cin >> len;
        for (int i = 0 ; i < len ; i++){
            for (int j = 0 ; j < len ; j++){
                int a;
                cin >> a;
                A[i][j] = a;
            }
        }
    }
    
    void Dijkstra(int v0)
    {
        bool S[MAXNUM];                                  // 判断是否已存入该点到S集合中
        int n=MAXNUM;
        for(int i=0; i<n; ++i) {
            dist[i] = A[v0][i];
            S[i] = false;                                // 初始都未用过该点
            if(dist[i] == MAXINT)    
                prev[i] = -1;
            else 
                prev[i] = v0;
        }
        dist[v0] = 0;
        prev[v0] = -1;
        S[v0] = true;
        for(int i=1; i<len; i++){
            int mindist = MAXINT;
            int u = v0;                            // 找出当前未使用的点j的dist[j]最小值
            for(int j=0; j<len; ++j){
                if((!S[j]) && dist[j]<mindist){
                    u = j;                             // u保存当前邻接点中距离最小的点的号码 
                    mindist = dist[j];
                }
            }
            S[u] = true; 
            for(int j=0; j<len; j++){
                if((!S[j]) && A[u][j]<MAXINT){
                    if(dist[u] + A[u][j] < dist[j])     //在通过新加入的u点路径找到离v0点更短的路径  
                    {
                        dist[j] = dist[u] + A[u][j];    //更新dist 
                        prev[j] = u;                    //记录前驱顶点 
                    }
                }
            }
        }
    }
    
    void output(){
        for(int i = 0 ; i < len ; i++){
            cout <<v00<< " to "<< i <<"'s minDis="<< dist[i] <<" path =( ";
            std::vector<int> p;
            int t = i;
            while(t != -1){
                //cout << t<<" ";
                p.push_back(t);
                t = prev[t];
            }
            //cout << "p size="<<p.size()<<endl;
            reverse(p.begin(), p.end());
            for(int j = 0 ; j < p.size() ; j++){
                cout << p[j] << " ";
            }
            cout << ")"<<endl;
        }
    }
    
    int main(){
        input();
        Dijkstra(v00);    
        output();
        return 0;
    }
  • 相关阅读:
    一段获取windows环境变量的代码
    尝试word2007的blog发布
    如何求一表所有行所有字段实际占用的空间
    如何查询全表扫描SQL
    Oracle 33个等待事件
    如何使用RMAN
    如何使用Diagnostics工具监控应用服务器
    如何查询每行数据的数据块信息
    如何理解recursive calls,db block gets和consistent gets
    如何编写批处理与SQLPLUS(例子)
  • 原文地址:https://www.cnblogs.com/huangshiyu13/p/5878829.html
Copyright © 2020-2023  润新知