迪杰斯特拉算法求最短路径

来源:互联网 发布:怎样建立网络平台 编辑:程序博客网 时间:2024/05/01 14:39

1[问题描述]

已知有向图有12个顶点,21条边,起点为S,终点为E,求从SE的最小成本花费W(如图)

起点    终点    花费           起点    终点    花费            起点    终点    花费

1        2       9              4       8       11               9      12      4

1        3       7              5       7       11               10     12      2

1        4       3              5       8       8                11     12      5

1        5       2              6       9       6

2        6       4              6       10      5

2        7       2              7       9       4

2        8       1              7       10      10

3        6       2              8       10      15

3        7       7              8       11      16

[输入要求]

     有多组测试数据,第一行输入S(1<=S<12),其中S为起点,E=12为终点,

[输出要求]

      每组测试数据对应一个输出,输出S到终点E最小成本花费W

[样例输入]

1

2

[样例输出]

16

10

源码分析:

#include <iostream.h>
#include <fstream.h>

#define MAX 100
#define MAX_INT 10000


int Shortest(int edge[][MAX],int v,int e,int st,int ed)
{
 int weight[MAX],s[MAX];/*weight数组是记录起点到其他点的最短距离,s数组是标记集合*/
 int i,j,k,mindist,u;

 for(i=0;i<MAX;i++)
  s[i]=0;

 for(i=1;i<=v;i++)
 {
  if(edge[st][i]!=-1)
  {
   weight[i]=edge[st][i];
  }
  else
  {
   weight[i]=-1;
  }
 }/*赋值weight所有与起点邻接的点距离,不邻接的赋值为-1*/

    s[st]=1;
 weight[st]=0;/*起始点初始化*/

    for(k=1;k<=v;k++)
 {
  mindist=MAX_INT;
  u=st;
  
  for(i=1;i<=v;i++)
   if(weight[i]>0&&s[i]==0&&weight[i]<mindist)
   {
    mindist=weight[i];
    u=i;
   }/*找到与起点邻接的距离最短点,记为u*/
   
   s[u]=1;/*标记u,并入s集合*/
   
   for(j=1;j<=v;j++)
   {
    if(edge[u][j]!=-1)/*找新入点的邻接点*/
     if(s[j]==0&&(weight[j]==-1)||(edge[u][j]+weight[u]<weight[j]))
     {
      weight[j]=edge[u][j]+weight[u];
     }
   }
 }/*新点并入集合后,刷新点之间的可达记录*/
 
 cout<<weight[ed]<<endl;/*输出到终点的最短权值*/
 return 0;
}

int main()
{
 ifstream infile("D://g.txt",ios::in);

 int c[MAX][MAX],v,e,i,st,ed,w;/*v是点数,e是边数,st是开始点,ed是指向点,w是权值*/
    int a,b;
 while(infile>>v>>e){
  for(a=0;a<MAX;a++)
   for(b=0;b<MAX;b++)
    c[a][b]=-1;
   
   for(i=0;i<e;i++){
    infile>>st>>ed>>w;
    c[st][ed]=w;
    c[ed][st]=w;
   }
   
   cout<<"Test case:输入起始点:/n";
   while(cin>>st)
   {
    Shortest(c,v,e,st,v);
   
   }
   
 }
 
 return 0;
}

 

 

 

原创粉丝点击