Dijsktra算法解决了有向图G=(V,E)上带权的单源最短路径问题。但要求所有边的权值非负。
思想:Dijkstra算法中设置了一顶点集合S,从源点s到集合中的顶点的最终最短路径的权值均已确定。算法反复选择具有最短路径估计的顶点u€V-S,并将u加入S中,对u的所有出边进行松弛。
/*==================================================*\
| Dijkstra 数组实现O (N^2 )
| Dijkstra --- 数组实现( 在此基础上可直接改为STL 的Queue实现)
| lowcost[] --- beg 到其他点的最近距离
| path[] -- beg为根展开的树,记录父亲结点
\*==================================================*/
#define INF 0x3F3F3F3F;
const int N=210;
int path[N],vis[N];
void Dijkstra(intcost[][N],int lowcost[N],int n,int beg)
{
int i,j,min;
memset(vis,0,sizeof(vis));
vis[beg]=1;
for(i=0; i<n; i++)
{
lowcost[i]=cost[beg][i];
path[i]=beg;
}
lowcost[beg]=0;
path[beg]=-1;
int pre=beg;
for(i=1; i<n; i++)
{
min=INF;
for(j=0; j<n; j++)
//下面的加法可能导致溢出,INF不能取太大
if(vis[j]==0&&lowcost[pre]+cost[pre][j]<lowcost[j])
{
lowcost[j]=lowcost[pre]+cost[pre][j];
path[j]=pre;
}
for(j=0; j<n; j++)
if(vis[j]==0&&lowcost[j]<min)
{
min=lowcost[j];
pre=j;
}
vis[pre]=1;
}
}