载入中...
 
     
 
载入中...
时 间 记 忆
载入中...
最 新 评 论
载入中...
专 题 分 类
载入中...
最 新 日 志
载入中...
最 新 留 言
载入中...
搜 索
用 户 登 录
载入中...
友 情 连 接
博 客 信 息
载入中...


 
 
载入中...
   
 
 
Dijkstra算法
[ 2008-9-16 19:15:00 | By: wantnon ]
 
1,将起点加入S;
2,S中新加顶点冲洗其所有后继(Min);
   找S外顶点中累积值最小者v; 
   如果v累积值有限,将v加入S,返回2。
   如果v累积值为无穷,无路径,退出;
   如果终点已加入S,终止。
结果:S中各点的累积值即为其到起点的最短路径长。
注:
1,S保持其中顶点累积值已达终态。
2,另设一数组追踪路径即可。
C++程序:
#i nclude<iostream.h>
ShortestPath (double weivvmat[][MAXNL+1],int Nv,int st,int ed)
{
    int i,j;
    bool S[MAXNL+1]={false};//记录顶点是否已加入(S[i]==true则i点已加入)
    int sumD[MAXNL+1];//各顶点的累积量
    for(i=1;i<=Nv;i++)sumD[i]=INF;//sumD初始化
    int foev[MAXNL+1]={0};//各点前驱
    S[st]=true;//加入起点
    sumD[st]=0;//起点累积量为0
    int LsAddV=st;//存新加入的顶点
    while(1)
    {
        //用新加入S的冲一次
        for(i=1;i<=Nv;i++)//搜索所有顶点i
        {
            if(weivvmat[LsAddV][i]!=INF//如果i是LsAddV的邻接点
                &&!S[i]//i不在S中(这个条件可有可无)
                &&sumD[LsAddV]+weivvmat[LsAddV][i]<sumD[i])//且i经LsAddV累积量更小
            {//更新点i的累积量
                sumD[i]=sumD[LsAddV]+weivvmat[LsAddV][i];
                //更新foev
                foev[i]=LsAddV;
            }
        }
        //找S外围点中累积量最小的点
        int min=INF;//S外围点的最小累积量
        int minv=0;//S外围点中累积量最小的点
        for(i=1;i<=Nv;i++)//搜索所有顶点i
        {
            if(!S[i]//如果i不在S中
                &&sumD[i]<min)//且i的累积量更小
            {
                min=sumD[i];
                minv=i;
            }
        }
        if(minv==0)
        {
            cout<<"错误:路径不通!"<<endl;
            exit(1);
        }
        //minv加入S
        S[minv]=true;
        LsAddV=minv;
        //如果终点已加入,终止
        if(S[ed]==true)break;
    }
    //输出路径
    int p=ed;
    while(p!=0)
    {
        cout<<p<<"("<<sumD[p]<<")"<<"←";
        p=foev[p];
    }
    cout<<endl;
}
 
 
发表评论:
载入中...
 
     
   
     
Powered by Oblog.