基本思路是:
选择出发点相邻的所有节点中,权最小的一个,将它的路径设置为确定。其他节点的路径需要保存起来。
然后从刚刚确认的那个节点的相邻节点,算得那些节点的路径长。然后从所有未确定的节点中选择一个路径最短的设置为确定。
重复上面步骤即可。
参考代码如下:
void Dijkstra(graph *g,string v)
{
int n = g->n;
int *flag = new int[n];
int *step = new int[n];
int i;
int startNode;
int sum=0;
for(i=0;i<n;i++)
{
flag[i]=0;
step[i]=9999;
}
for(i=0;i<g->n;i++)
{
if(VName[i]==v)
startNode=i;
}
flag[startNode]=1;
step[startNode]=0;
sum++;
struct edge*p = g->v[startNode].list;
while(p!=NULL)
{
int temp = step[startNode]+p->weights;
if(temp<step[p->vertex])
{
step[p->vertex]=temp;
}
p=p->next;
}
while(sum<n)
{
int min=9999;
int t;
for(i=0;i<n;i++)
{
if(flag[i]==0) //找到未确定的路径最短的那个节点
{
if(min>step[i])
{
min=step[i];
t=i;
}
}
}
flag[t]=1;
sum++;
p=g->v[t].list;
while(p!=NULL)
{
int temp = step[t]+p->weights;
if(temp<step[p->vertex])
{
step[p->vertex]=temp;
}
p=p->next;
}
}
cout<<"From "<<v<<" to different node is :"<<endl;
for(i=0;i<n;i++)
{
cout<<VName[i]<<" : "<<step[i]<<endl;
}
}