您的位置:首页 > 其它

一点到其他点的最短路径

2017-01-13 22:13 411 查看
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 100

typedef struct node {
int matrix[M]
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息