ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Dijkstra

2020-09-03 19:32:02  阅读:252  来源: 互联网

标签:pre point int thisStart Dijkstra settled shortest




#include "Dijkstra.h"
#include <vector>
#include <list>
#include <cmath>

Dijkstra::Dijkstra(int vertexCount) {
    this->v = vertexCount;
    this->adj = new vector<int>[v];
}

list<int> Dijkstra::search(int s, int t) {
    list<int> result;
    if (s == t){
        result.push_front(s);
        return result;
    }


    bool settled[v];
    int pre[v];
    int shortest[v];

    //初始化字段
    for (int i = 0; i < v; ++i) {
        settled[i] = false;
        pre[i] = -1;
        shortest[i] = INT_MAX;
    }

    settled[s] = false;
    shortest[s] = 0;
    while(true){

        int thisStart = getNextStart(settled, shortest);

        if(thisStart == -1){
            //可连通的线路已经全部遍历完毕
            break;
        } else {
            settled[thisStart] = true;
        }

        vector<int> sides = adj[thisStart];
        for (int point = 0; point < v; ++point) {
            if (settled[point]){
                continue;
            }
            int length = sides.at(point);
            //s 和 point 相互连接,且不是自己连自己
            if (length != INT_MAX && thisStart != point){
                int newLength = shortest[thisStart] + length;
                if(shortest[point] > newLength){
                    shortest[point] = newLength;
                    pre[point] = thisStart;
                }
            }
        }

    }




    //如果s到t是可达的
    if (settled[t]){
        result.push_front(t);
        while(true){
            if(pre[t] != -1){
                result.push_front(pre[t]);
                t = pre[t];
            } else {
                break;
            }
        }
    }


    return result;
}

int Dijkstra::getNextStart(bool *settled, int *shortest) {
    int unsettledAndShortestIndex = -1;
    int unsettledAndShortestDistance = INT_MAX;
    for (int i = 0; i < v; ++i) {
        bool isSettle = settled[i];
        int distance = shortest[i];
        if (!isSettle && distance < unsettledAndShortestDistance){
            unsettledAndShortestIndex = i;
            unsettledAndShortestDistance = distance;
        }
    }
    return unsettledAndShortestIndex;
}


标签:pre,point,int,thisStart,Dijkstra,settled,shortest
来源: https://www.cnblogs.com/IC1101/p/13609844.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有