这是一个用优先队列实现的最短路径dijkstra算法(已经实现两点间最短距离),怎样才能也显示路径上经过的点呢

//minimal path use priority queue  
 #include<iostream>  
 #include<queue>  
 #include<algorithm>  
 using namespace std;  
 #define INF 200  
 #define MAXN 1100  
 struct way  
 {  
  int s;  
  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] means the minimal path from i to j
 
   
 void dijk(int endpoint)//dijk find minimal distance between each point to endpoint  
  {  
  priority_queue<way>Q;  
  bool flag[MAXN]={false};//flag[i]==1 means it is in the end point set  
  way temp,now;  
  now.s=endpoint;  
  now.d=0;  
  Q.push(now);
  point[endpoint][endpoint]=0; 
   
  while(!Q.empty())  
  {  
  now=Q.top();  
  Q.pop();//use priority queue to ensure pop the point with minimal distance every time  
  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[i][endpoint]>point[now.s][endpoint]+map[i][now.s])  
  {  
  temp.s=i;  
  temp.d=point[now.s][endpoint]+map[i][now.s];  
  point[i][endpoint]=temp.d; 
prev[endpoint]=i;
  Q.push(temp);  
 
  }  
  }  
  }  
 }  
   
 void init()//初始化  
 {  
  int i,j;  
  int a,b,c;  
  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]); //输入图网的简单矩阵 
 }  


 int main()  
 {  
  int m;  
  while(scanf("%d",&n)!=EOF&&n!=0)   //输入简单图中节点个数
  {  
  init();  
  for(int i=1;i<=n;i++)  
  dijk(i);//find minimal distance between each point to endpoint  
  int a,b;  
  while(scanf("%d%d",&a,&b))  
  {  
  if(a==0&&b==0)  
  {  
  cout<<endl;  
  break;  
  }  
  else  
  printf("%d/n",point[a][b]); //通过输入两个端点显示两点间最短路径长度

   
}

  } 
 
  return 0;  
 }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值