int dist[p];//记录原点到各点的最短路径 最开始是直接距离,后边依次变化找最小
int path[p];//记录原点到该点经过的某点 打印路径需要
int collected[]//表示找到最短路径的点收集
collected[]//未收集时是false 收集后为true
该算法是以一个起始点 找到最小的另一个点,另一个点修改到其他点距离(距离变小),最后全部顶点都经历则结束。
void dijkstra(graph g,int collected[], int dist[],int path[],char v)
{
int m,n,i,min;
int t=locate(g,v);//获取起始点下标
collected[t]=true;
for(int i=0;i<g.vexnum;i++)
{
if(i==t)
{
dist[i]=0;//原点距离为0
}
else
{
dist[i]=g.arcs[t][i];//其余距离为权值
}
}//将dist[]初始化
while (1)
{
m=1;
for( i=0;i<g.vexnum;i++)
{
if(collected[i]==false)
{
min=dist[i];//假设min为其值
n=i;//假设n为最小值的下标
m=0;//判断位
break;
}
}
if(m==1)
{
break;//当所有都被访问了退出
}
else
{
for( i=0;i<g.vexnum;i++)
{
if(min>dist[i]&&collected[i]==false)
{
min=dist[i];//该n为真最小
n=i;//该n为真最小
}
}
collected[n]=true;//找到最小则 收进去
for( i=0;i<g.vexnum;i++)//遍历所有未访问的点
{
if(collected[i]==false)//未访问
{
if(dist[n]+g.arcs[n][i]<dist[i])//找到最小点 到另一点距离小于原来就修改
{
dist[i]=dist[n]+g.arcs[n][i];
path[i]=n;
}
}
}
}
}
for(i=0;i<g.vexnum;i++)
{
if(i!=locate(g,v))
cout<<v<<"到点"<<g.vexs[i]<<"最短路径为"<<dist[i]<<endl;
}//打印该点到其他点最短距离
}