dijstra算法练习

来源:互联网 发布:西门子plc编程 编辑:程序博客网 时间:2024/04/27 22:46

已知如图所示:

边上的值为x节点到y节点的距离,求0节点到其他各点的最短路径。

求解已知权值的有向图中某点到各点的最短路径,利用dijstra算法求解,代码如下:

#include <iostream>

#include<stack>

#define M 100

#define N 100

using namespace std;

 

typedef struct node

{

   int matrix[N][M];      //邻接矩阵

   int n;                 //顶点数

   int e;                 //边数

}MGraph;

 

void DijkstraPath(MGraph g,int *dist,int*path,int v0)   //v0表示源顶点

{

   int i,j,k;

   bool *visited=(bool *)malloc(sizeof(bool)*g.n);

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

    {

       if(g.matrix[v0][i]>0 && i!=v0)

       {

           dist[i]=g.matrix[v0][i];

           path[i]=v0;     //path记录最短路径上从v0到i的前一个顶点

       }

       else

       {

           dist[i]=INT_MAX;    //若i不与v0直接相邻,则权值置为无穷大

           path[i]=-1;

       }

       visited[i]=false;

       path[v0]=v0;

       dist[v0]=0;

    }

   visited[v0]=true;

   for(i=1;i<g.n;i++)     //循环扩展n-1次

    {

       int min=INT_MAX;

       int u;

       for(j=0;j<g.n;j++)    //寻找未被扩展的权值最小的顶点

       {

           if(visited[j]==false && dist[j]<min)

            {

                min=dist[j];

                u=j;

           }

       }

       visited[u]=true;

       for(k=0;k<g.n;k++)   //更新dist数组的值和路径的值

       {

           if(visited[k]==false && g.matrix[u][k]>0 &&min+g.matrix[u][k]<dist[k])

            {

                dist[k]=min+g.matrix[u][k];

                path[k]=u;

           }

       }

    }

}

 

void showPath(int *path,int v,int v0)   //打印最短路径上的各个顶点

{

   stack<int> s;

   int u=v;

   while(v!=v0)

    {

       s.push(v);

       v=path[v];

    }

   s.push(v);

   while(!s.empty())

    {

       cout<<s.top()<<" ";

       s.pop();

    }

}

 

int main(int argc, char *argv[])

{

   int n,e;     //表示输入的顶点数和边数

   while(cin>>n>>e&&e!=0)

    {

       int i,j;

       int s,t,w;      //表示存在一条边s->t,权值为w

       MGraph g;

       int v0;

       int *dist=(int *)malloc(sizeof(int)*n);

       int *path=(int *)malloc(sizeof(int)*n);

       for(i=0;i<N;i++)

           for(j=0;j<M;j++)

                g.matrix[i][j]=0;

       g.n=n;

       g.e=e;

       for(i=0;i<e;i++)

       {

           cin>>s>>t>>w;

           g.matrix[s][t]=w;

       }

       V0=0;

       DijkstraPath(g,dist,path,v0);

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

       {

           if(i!=v0)

           {

                showPath(path,i,v0);

               cout<<dist[i]<<endl;

           }

       }

    }

   return 0;

}

先依次将各点到0点的距离存入dist数组中进行初始化,没有和0点直接相连的值设置为无限大,dijkstra函数中,先找到距离0点最近的那个节点x,然后,计算其他某点到x再到0点的距离,是否比它直接到0点的距离小,小则更新dist数组,并将x的值存入path数组中,表示到x点前,先到path【x】点则距离最小,然后将x节点标记为已经访问。从未访问的节点中,寻找距离0节点最近的点y,依旧计算其他点到y点再到0点的距离,是否比它直接到0点的距离小,小则继续更新dist数组,将y存入对应的path数组的位置中。

因为path数组中存入的是到某点前的一个点的编号,所以,用栈来,依次输出0节点到其他节点的最短路径依次经过哪些节点。

0 0
原创粉丝点击