以hdu1385为例子。http://acm.hdu.edu.cn/showproblem.php?pid=1385
一:floyed+路径输出
我们除了用dis[][]存储个点之间的距离之外,我们还需要用一个path[][]二维数组记录路径。开始看了网上有很多path记录的方法。
- 用path[i][j]记录终点j的(其实实现不了)
- 用path[i][j]记录终点j的前一个结点(开始自己用的就是这种方法,但是不知道错哪里了)
- 用path[i][j]记录i结点的后面的第一个结点。
我们采用的是第三种方法
初始化:
memset(path,-1,sizeof(path));
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
scanf("%d",&dis[i][j]);
if(-1==dis[i][j])
dis[i][j]=inf;
else
path[i][j]=j;
}
}
更新
//这个是普遍的写法,hdu1385还需要在此基础上加点东西。
for(res k=1;k<=N;k++){
for(res i=1;i<=N;i++){
for(res j=1;j<=N;j++){
if(dis[i][j]>dis[i][k]+dis[k][j]+cost[k]){
dis[i][j]=dis[i][k]+dis[k][j]+cost[k];
path[i][j]=path[i][k];
}
}
}
}
//思考:为甚麽不是path[i][j]=k呢?
//因为path[i][k]记录的是