C看完了,数据结构也快了,算法看的不爽,还是自己重新写一遍程序来心里比较塌实
#i nclude<iostream.h>
#i nclude<cstdlib>
#define max 6//顶点的数量
#define big 10000
void dijkstra(int vx,int AA[],int D[],int LJ[][max]);
int main()
{
int AA[max];//把顶点分成两类,1表示已经在最小路径里的顶点,0表示还没有在最小路径里的顶点
int LJ[max][max];//邻接矩阵
int D[max];//记录到每个顶点的最小代价
int i,j,vx;
for(i=0;i<max;i++)
for(j=0;j<max;j++)
LJ[j]=big;
LJ[0][2]=10;LJ[0][4]=30;LJ[0][5]=100;LJ[1][2]=5;LJ[2][3]=50;LJ[3][5]=10;LJ[4][3]=20;LJ[4][5]=60;
for(vx=0;vx<max;vx++)//对每个顶点调用dijkstra算法,从而产生从顶点vx到到各顶点的最小路径,适合于有向图,如果是无向图,还要比较i->j和j->i的最短路径哪个更小
{
for(i=0;i<max;i++)
D=LJ[vx];//初始化最小代价
for(i=0;i<max;i++)//初始化顶点分类
AA=0;
AA[vx]=1;
dijkstra(vx,AA,D,LJ);
cout<<endl;
}
system("pause");
return 0;
}
void dijkstra(int vx,int AA[],int D[],int LJ[][max])
{
int i,j,k;
for(k=0;k<max;k++)//每次求出一条最小路径
{
for(i=0;i<max;i++)//本层循环是求出这时每个不在最小路径顶点集里的顶点到顶点vx的最小代价
for(j=0;j<max;j++)//本层循环是求出顶点i通过最小路径顶点集到顶点vx的最小路径
if(LJ[j]+D[j]<D && AA[j]==1 && AA==0)
D=LJ[j]+D[j];
int small=vx,value=big+1;//初始化,防止出错
for(j=0;j<max;j++)//求出本次循环产生的最小路径
if(D[j]<value && AA[j]==0)
{
value=D[j];
small=j;
}
AA[small]=1;//这次求出的最小路径是顶点vx到顶点small的,所以要把顶点small从不是最小路径里的顶点,变成最小路径里的顶点
}
for(i=0;i<max;i++)
{
if(i==vx);
else if(D==big)
cout<<vx<<"->"<<i<<":没有通路"<<endl;
else
cout<<vx<<"->"<<i<<"最小路径为:"<<D<<endl;
}
}