Dijkstra算法与Floyed代码详解

一:Dijkstra算法

详解代码



#define INF 0x3f3f3f

struct node

{

    int L,W;

}Map[MAX][MAX];//用邻接矩阵表示图,图中每个元素含两个值L,W;L为路径长度,W为收费情况

int visit[MAX];

int path[MAX]; //储存路径长度

int weight[MAX];//储存收费情况

int Dijkstar(int n,int s,int d)//迪杰斯特拉算法

{

    int k;

    for(int i=0;i<n;i++)//初始化

    {

        path[i]=Map[s][i].L;//将与S点有连线的顶点初始化其路径长度,即权值

        weight[i]=Map[s][i].W;//将与0点有连线的顶点加上费用值,也看做权值

    }

    path[s]=0;

    visit[s]=1;

    for(int i=1;i<n;i++)//开始主循环,每次求得s到某个n顶点的最短路径

    {

        int Min = INF;

        for(int j=0;j<n;j++)

        {

            if(!visit[j]&&path[j]<Min)

            {

                k=j;

                Min = path[j];

            }

        }

            visit[k]=1;//将目前找到的最近的顶点置1

 

            for(int i=0;i<n;i++)//修正当前路径

            {

                if(!visit[i]&&Map[k][i].L<INF)

                {

                    if(path[k]+Map[k][i].L<path[i])//以当前点为起点寻找下一个最短路

                    {

                        path[i]=path[k]+Map[k][i].L;

                        weight[i]=weight[k]+Map[k][i].W;

                    }

                    else if(path[k]+Map[k][i].L==path[i])//若存在相同路径,则比较相同路径上费用和的大小,选择小的存入weight数组

                    {

                        if(weight[k]+Map[k][i].W<weight[i])

                        {

                            weight[i]=weight[k]+Map[k][i].W;

                        }

                    }

                }

            }

    }

    cout<<path[d]<<" "<<weight[d];

    cout<<endl;

    return 0;

}

二:Floyed算法代码详解



#define INF 0x3f3f3f

struct node

{

    int L,W;

}Map[MAX][MAX];

 

int D[MAX][MAX];//储存任意两点间的最短路

int path[MAX][MAX];//储存要到达顶点的前驱顶点

int weight[MAX][MAX];//储存任意两点间的最小费用

 

int Floyed(int n,int s,int d)//Floyed算法求最短路

{

    for(int i=0;i<n;i++)

    {

        for(int j=0;j<n;j++)

        {

            D[i][j]=Map[i][j].L;

            weight[i][j]=Map[i][j].W;

            path[i][j]=-1;

        }

    }

 

    for(int k=0;k<n;k++)

    {

        for(int i=0;i<n;i++)

        {

            for(int j=0;j<n;j++)

            {

                if(D[i][j]>D[i][k]+D[k][j])

                {

                    D[i][j]=D[i][k]+D[k][j];

                    weight[i][j]=weight[i][k]+weight[k][j];

                    path[i][j]=k;

                }

                else if(D[i][j]==D[i][k]+D[k][j]) //若存在相同路径,选择费用较小的一条

                {

                    if(weight[i][j]>weight[i][k]+weight[k][j])

                    {

                        weight[i][j]=weight[i][k]+weight[k][j];

                        path[i][j]=k;

                    }

                }

 

            }

        }

    }

   

    cout<<D[s][d]<<" "<<weight[s][d]<<endl;

    return 0;

}


猜你喜欢

转载自blog.csdn.net/Eider1998/article/details/84594128
今日推荐