求最短路径——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(); } }