一点到其他点的最短路径

来源:互联网 发布:删除静态ip ubuntu 编辑:程序博客网 时间:2024/06/11 01:00

M*M的方格矩阵,其中有一部分为障碍,八个方向均可以走,现假设矩阵上有Q+1节点,从(X0,Y0)出发到其他Q个节点的最短路径。
其中,1<=M<=1000,1<=Q<=100。

#include <iostream>#include <stack>using namespace std;#define M 100#define N 100typedef struct node {int matrix[M][N];int n;//顶点数int e;//边数} MGraph;void dijstraPath(MGraph g, int* dist, int* path, int v0) {bool* visited = new bool[sizeof(bool) * g.n];for (int i = 0; i < g.n; ++i) {if (g.matrix[v0][i] > 0 && i != v0) {dist[i] = g.matrix[v0][i];path[i] = v0;} else if (i == v0) {dist[v0] = 0;path[v0] = v0;} else {dist[i] = INT_MAX;path[i] = -1;}visited[i] = false;}visited[v0] = true;for (int i = 1; i < g.n; ++i) {int min = INT_MAX;int u = v0;for (int j = 0; j < g.n; ++j) {if (!visited[j] && dist[j] < min) {min = dist[j];u = j;}}visited[u] = true;for (int i = 0; i < g.n; ++i) {if (!visited[i] && g.matrix[u][i] > 0&& g.matrix[u][i] + min < dist[i]) {dist[i] = g.matrix[u][i] + min;path[i] = u;}}}}void showPath(int* path, int v, int v0) {stack<int> s;while (v0 != v) {s.push(v);v = path[v];}s.push(v);while (!s.empty()) {cout << s.top() << " ";s.pop();}}int main() {MGraph g;g.e = 7;g.n = 5;memset(g.matrix, 0, sizeof(int) * N * M);//初始化数据g.matrix[0][1] = 100;g.matrix[0][2] = 30;g.matrix[0][4] = 10;g.matrix[2][1] = 60;g.matrix[2][3] = 60;g.matrix[3][1] = 10;g.matrix[4][3] = 50;int v0 = 0;int* dist = new int[g.n];int* path = new int[g.n];dijstraPath(g, dist, path, v0);for (int i = 0; i < g.n; i++) {if (i != v0) {showPath(path, i, v0);cout << " shortest route: " << dist[i] << endl;}}return 0;}


0 0
原创粉丝点击