贪心算法之Dijkstra

Posted gpf951101

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了贪心算法之Dijkstra相关的知识,希望对你有一定的参考价值。

贪心算法的主要思想就是通过不断求解局部最优解,最后求出最优解或者最优解的近似值,不能保证一定为最优解。

Dijistra算法,选取没有选择过的点到已经选择过得点组成的集合中最短的距离的点。然后更新已选择的点到没有选择的点的距离。

已经选择的点是一个整体。

具体算法如下:

#include <iostream>
#include <stack>

using namespace std;

const int IDF = 1e7; //距离最大值
const int N = 100; //点的数量最大值
int map[N][N]; //点与点之间的距离
int n; //点的数量
int m; //线的数量
int dist[N]; //源点到其他点的距离
bool flag[N]; //是否已加入找到集
int p[N]; //记录路径

void Dijkstr(int u); //计算距离

void findpath(int u);

int main() {
    int u, v, w; //起点 终点 权重
    cout << "请输入点的个数:";
    cin >> n;
    cout << "请输入线的数量:";
    cin >> m;
    //初始化
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            map[i][j] = IDF;
        }
    }
    cout << "请输入两点及两点之间的距离:" << endl;
    while (m > 0) {
        cin >> u >> v >> w;
        map[u][v] = min(w, map[u][v]);
        m--;
    }
    cout << "请输入起点:";
    cin >> u;
    cout << "信息输入完毕,开始计算地杰斯特拉距离" << endl;
    Dijkstr(u);
    findpath(u);
    return 0;
}

void findpath(int u) {
     int temp;
     stack<int> s;
     cout<<"源点为:"<<u<<endl;
     for(int i = 0; i < n; i++){
         temp = p[i];
         while(temp != -1){
             s.push(temp);
             temp = p[temp];
         }
         cout<<u<<""<<i<<"的距离为:"<<dist[i]<<";路径为:";
         while(!s.empty()){
             cout<<s.top()<<"--";
             s.pop();
         }
         cout<<i<<endl;
     }
}

void Dijkstr(int u) {
    //初始化
    for (int i = 0; i < n; i++) {
        dist[i] = map[u][i];
        flag[i] = false;
        if(dist[i] == IDF)
            p[i] = -1;
        else
            p[i] = u;
    }
    //初始化起点
    dist[u] = 0;
    flag[u] = true;
    for (int j = 0; j < n; j++) {//找n次
        //从没有找到的点中找最近的
        int temp = IDF;
        int t = u;
        for (int i = 0; i < n; i++) {
            if (flag[i] == false && dist[i] < temp) {
                temp = dist[i];
                t = i;
            }
        }
        if (t == u) { //没有找到 原距离不变
            return;
        }
        //更新距离 找到t点
        flag[t] = true;
        for (int i = 0; i < n; i++) {
            if (flag[i] == false && map[t][i] + dist[t] < dist[i]) {
                dist[i] = map[t][i] + dist[t];
                p[i] = t;
            }
        }
    }
}

 

以上是关于贪心算法之Dijkstra的主要内容,如果未能解决你的问题,请参考以下文章

贪心算法-图的最短路径算法Dijkstra之证明

最短路问题之Dijkstra算法

单源最短路径Dijkstra算法的思想详细步骤代码

[Python]贪心算法-Dijkstra-实现

[C++]单源最短路径:迪杰斯特拉(Dijkstra)算法(贪心算法)

图论——关于Dijkstra的贪心思想