Dijkstra算法是典型最短路算法,用于计算一个节点到其他节点的最短路径;
主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止;
Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低;
#include<cstdlib>
#include<iostream>
#include<fstream>
#define MaxNum 987654321
using namespace std;
ifstream fin("Dijkstra.in");
ofstream fout("Dijkstra.out");
int Map[501][501];
bool is_arrived[501];
int Dist[501],From[501],Stack[501];
int Source,Vertex;
int FindMin()
{
int p,Temp=0,Minm=MaxNum;
for(p=1;p<=Vertex;p++)
{
if(Dist[p]<Minm&&(!is_arrived[p]))
{
Minm=Dist[p];
Temp=p;
}
}
return Temp;
}
int main(int argc,char *argv[])
{
int p,q,k,Path,Temp,SetCard;
memset(is_arrived,0,sizeof(is_arrived));
fin>>Source>>Vertex;
for(p=1;p<=Vertex;p++)
{
for(q=1;q<=Vertex;q++)
{
fin>>Map[p][q];
if(Map[p][q]==0)
Map[p][q]=MaxNum;
}
}
for(p=1;p<=Vertex;p++)
{
Dist[p]=Map[Source][p];
if(Dist[p]!=MaxNum)
From[p]=Source;
else
From[p]=p;
}
is_arrived[Source]=true;
SetCard=1;
do
{
Temp=FindMin();
if(Temp!=0)
{
SetCard=SetCard+1;
is_arrived[Temp]=true;
for(p=1;p<=Vertex;p++)
{
if((Dist[p]>Dist[Temp]+Map[Temp][p])&&(!is_arrived[p]))
{
Dist[p]=Dist[Temp]+Map[Temp][p];
From[p]=Temp;
}
}
}
else
break;
}while(SetCard!=Vertex);
for(p=1;p<=Vertex;p++)
{
if(p!=Source)
{
fout<<"========================\n";
fout<<"Source:"<<Source<<"\nTarget:"<<p<<"\n";
if(Dist[p]==MaxNum)
{
fout<<"Distance:"<<"Infinity\n";
fout<<"Path:No way!";
}
else
{
fout<<"Distance:"<<Dist[p]<<"\n";
k=1;
Path=p;
while(From[Path]!=Path)
{
Stack[k]=Path;
Path=From[Path];
k=k+1;
}
fout<<"Path:"<<Source;
for(q=k-1;q>=1;q--)
fout<<"-->"<<Stack[q];
}
fout<<"\n========================\n\n";
}
}
fin.close();
fout.close();
system("PAUSE");
return EXIT_SUCCESS;
}