Dijsktra算法C++实现

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;

    }

}

 

你可能感兴趣的:(C++)