已经实现了最短距离的优先队列dijkstra算法,怎么回溯出最短距离路线上经过的点呢?

 

//此程序成功找到了邻接矩阵中两点的最短距离长度,但是没有实现路径中经过的点的显示
 #include<iostream> 
 #include<queue> 
 #include<algorithm> 
 using namespace std; 
 #define INF 200  //最大距离表示节点之间不通
 #define MAXN 1100 
 struct way  //放入优先队列Q中的结构体
 { 
     int s;//v->s=d 
     int d;//distance 
     bool operator <(const way k)const 
     { 
         return k.d<d;//sort from small to big 
     } 
 }; 
  
 int n; 
 int map[MAXN][MAXN]; //存储邻接矩阵中节点间距离的数组
 int point[MAXN][MAXN];//point[i][j] 存储节找到的点间最短距离的数组
 
 void dijk(int v)//找到节点v到每个点的最短距离point[v][i] 
  { 
     priority_queue<way>Q; 
     bool flag[MAXN]={false};//flag[i]==1 means it is in the end point set 
     way temp,now; 
     now.s=v; //初始化way的实例now,并将节点加入队列
     now.d=0; 
     Q.push(now); 
     point[v][v]=0; //初始化最短距离
     //prev[v]=0;
  
     while(!Q.empty()) 
     { 
         now=Q.top();  //队列重排列
         Q.pop();//使用优先队列的pop功能使已找到的最短距离节点出队列 
         if(flag[now.s]) 
             continue; 
         flag[now.s]=1; 
         for(int i=1;i<=n;i++)
         { 
             if(!flag[i]&&map[now.s][i]!=INF&&point[v][i]>point[v][now.s]+map[now.s][i])  //修改经过now.s到集合任意点上可达的最短距离
             { 
                 temp.s=i; 
                 temp.d=point[v][now.s]+map[now.s][i]; 
                 point[v][i]=temp.d;
                 prev[v]=temp.s;
                 Q.push(temp); 
                 
             } 
         } 
     } 
 }
 
 void init()//初始化 
 { 
     int i,j; 
     int a,b,c;
     prev = (int *)malloc(sizeof(int)*n);
     cout<<"请输入邻接矩阵,权值间以空格分隔"<<endl;
     for(i=1;i<=n;i++) 
     { 
         for(j=1;j<=n;j++) 
             point[i][j]=INF;  //初始化最短路径
     } 
     for(i=1;i<=n;i++) 
         for(j=1;j<=n;j++) 
             scanf("%d",&map[i][j]);//输入邻接矩阵,200表示不通 
 } 

 

int main() 
 { 
     int m; 
     cout<<"请输入节点个数"<<endl;
     while(scanf("%d",&n)!=EOF&&n!=0)  //输入节点个数
     { 
         init(); 
         for(int i=1;i<=n;i++) 
             dijk(i);//find minimal distance between v to each point i 
         int a,b;
         cout<<"请输入起点a和终点b,以空格间隔"<<endl;
         while(scanf("%d%d",&a,&b)) 
         { 
             if(a==0&&b==0) 
             { 
                 cout<<endl; 
                 break; 
             } 
             else 
                 printf("%d/n",point[a][b]);//显示两点a b间最短路径距离
                
         }
       
     }
     
     return 0; 
 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值