您的位置:首页 > 其它

Dijkstra单源最短路径

2011-02-21 17:51 260 查看
#include <vector>
#include <list>
#include <iterator>
#include <algorithm>
#include <numeric>
#include <functional>
#include <climits>
using namespace std;
int vecCounter = 0;
int SourceVector = 0;
vector<vector<int> > g;//存储graph信息
vector<bool> known;//标记是否探明各点最短路径
vector<int> dist;//各点的最短路径长度
vector<int> preVector;//各点最短路径下的前一个顶点
void Dijkstra(int s)
{
known.assign(vecCounter, false);
dist.assign(vecCounter, INT_MAX);
preVector.resize(vecCounter);//初始化known, dist, preVector

dist[s] = 0;
for(;;)
{
int min = INT_MAX, v = s;
for(int i = 0; i<vecCounter; i++)
if(!known[i] && min > dist[i])
{
min = dist[i];
v = i;
}
if(min == INT_MAX)
break;
known[v] = true;
for(int w = 0; w<vecCounter;w++)
{
if (!known[w] && g[v][w] < INT_MAX && dist[w] > dist[v] + g[v][w])
{
dist[w] = dist[v] + g[v][w];
preVector[w] = v;
}
}
}
}
void Print_SP(int v)
{
if (v != SourceVector) Print_SP(preVector[v]);
cout << v << " ";
}


main

int main()
{
vecCounter = 7;
g.assign(vecCounter, vector<int>(vecCounter, INT_MAX));
g[0][1] = 2; g[0][3] = 1; g[0][2] = 4;
g[1][3] = 3; g[1][4] = 10;
g[2][0] = 4; g[2][5] = 5;
g[3][2] = 2; g[3][4] = 2; g[3][5] = 8; g[3][6] = 4;
g[4][6] = 6;
g[6][5] = 1;
SourceVector = 0;
Dijkstra(0);
copy(dist.begin(), dist.end(), ostream_iterator<int>(cout, " ")); cout << endl;
for (int i = 0; i < vecCounter; ++i)
if(dist[i] != INT_MAX)
{
cout << SourceVector << "->" << i << ": ";
Print_SP(i);
cout << endl;
}
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: