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

来源:互联网 发布:mac git 添加文件夹 编辑:程序博客网 时间:2024/05/18 02:04

//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;  
 }