//此程序成功找到了邻接矩阵中两点的最短距离长度,但是没有实现路径中经过的点的显示
#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;
}