求最短路径——Dijkstra算法

Dijkstra算法用于寻找有权图中的从一个顶点到其他顶点的最短路径(不适用于负权图)。

下面这篇博文给出了介绍Dijkstra算法的比较好的一个例子:

http://blog.csdn.net/u013071074/article/details/29582381

下面是代码:

#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std;
int path[]
struct node{
    int matrix[100][100]; //邻接矩阵
    int n; //顶点数
    int e; //边数 
}graph;

void DijkstraPath(graph g, int *dist, int *path, int v0) {
    //v0代表起始点
    bool * visited = new bool[g.n];
    for (int i = 0; i < g.n; i++) {
        if (g.matrix[v0][i]) {
            dist[i] = g.matrix[v0][i];
            path[i] = v0;
        }
        else {
            dist[i] = INT_MAX;
            path[i] = -1;
        }
        visited[i] = false;
        path[v0] = v0;
        dist[v0] = 0;
    } 
    visited[v0] = true;
    //循环n-1次,这里的i没啥用 
    for (int i = 0; i < g.n - 1; i++) {
        int min = INT_MAX;
        int u;
        for (int j = 0; j < g.n; j++) {
            if (!visited[j] && dist[j] < min) {
                min = dist[j];
                u = j;
            }
        }
        visited[u] = true;
        for (int k = 0; k < g.n; k++) {
            if (!visited[k] && g.matrix[u][k] && min + g.matrix[u][k] < dist[k]) {
                dist[k] = min + g.matrix[u][k];
                path[k] = u;

            }
        } 
    }
    delete [] visited;
} 
void showPath(int *path, int v/*目标节点*/, int v0) {
    stack<int> s;
    while (v != v0) {
        s.push(v);
        v = path[v];
    }
    s.push(v);
    while (!s.empty()) {
        cout << s.top() << endl;
        s.pop();
    }
}

 

posted @ 2017-10-16 19:12  fengzw  阅读(422)  评论(0编辑  收藏  举报