double dijkstra(int src, int dest, vector<int>& path, vector<map<int, double> >& adjT)
{
if (src < 0 || src >= adjT.size() || dest < 0 || dest >= adjT.size())
return -1;
map<int,int> previous; //记录最短路径上每个点的前驱点
set<int> V; //未计算的点
map<int, double> distance; //记录src到各顶点的距离
int i;
for (i=0; i<adjT.size(); i++) //初始化V和distance
{
V.insert(i);
map<int,double>::const_iterator it = adjT[src].find(i);
if (it != adjT[src].end())
distance[i] = it->second;
else
distance[i] = DBL_MAX;
}
V.erase(src);
for (int time=1; time<adjT.size(); time++)
{
for (int f=0; f<adjT.size(); f++)
cout<<distance[f]<<' ';
cout<<endl;
double min = DBL_MAX;
int v = src; //记录V中到src点最短的点
for (set<int>::iterator it=V.begin(); it!=V.end(); ++it)
{
if (distance[*it] < min)
{
min = distance[*it];
v = *it;
}
}
V.erase(v); //
for (set<int>::iterator it2=V.begin(); it2!=V.end(); ++it2) //更新距离表
if (adjT[v].find(*it2) != adjT[v].end())
{
const double newDist = distance[v] + adjT[v][*it2];
if (newDist < distance[*it2])
{
distance[*it2] = newDist;
previous[*it2] = v;
}
}
}
//写入最短路径
int prev = dest;
while (prev != src)
{
prev = previous[prev];
path.push_back(prev);
}
reverse(path.begin(), path.end());
return distance[dest]; //返回最短距离
}