题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1385
这题第一次是用spfa做的,结果提交了好几次都WA,一看题解才发现还有个对路径进行字典序排序问题。。。。。sad。。。然后试着写了写,好麻烦的感觉。。看题解,果然好麻烦。。于是换成floyd做,记录路径并且排序的时候就方便多了。
代码如下:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include<algorithm>
using namespace std;
int path[1001][1001], mp[1001][1001], b[1001], n, maxint=10000000;
void floyd()
{
int i, j, k;
for(i=1;i<=n;i++)
for(k=1; k<=n; k++)
{
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
if(mp[i][j]>mp[i][k]+mp[k][j]+b[k])
{
mp[i][j]=mp[i][k]+mp[k][j]+b[k];
path[i][j]=path[i][k];
}
else if(mp[i][j]==mp[i][k]+mp[k][j]+b[k])
{
if(path[i][k]<path[i][j])
{
path[i][j]=path[i][k];
}
}
}
}
}
}
int main()
{
int i, j, x, y;
while(scanf("%d",&n)!=EOF&&n)
{
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
path[i][j]=j;
scanf("%d",&mp[i][j]);
if(mp[i][j]==-1)
{
mp[i][j]=maxint;
}
}
}
for(i=1; i<=n; i++)
scanf("%d",&b[i]);
floyd();
while(scanf("%d%d",&x,&y)!=EOF)
{
if(x==-1&&y==-1) break;
if(x==y)
{
printf("From %d to %d :\n",x,y);
printf("Path: %d\n",x);
printf("Total cost : 0\n\n");
continue;
}
printf("From %d to %d :\n",x,y);
printf("Path: %d",x);
for(i=x;i!=y;i=path[i][y])
{
printf("-->%d",path[i][y]);
}
printf("\nTotal cost : %d\n",mp[x][y]);
printf("\n");
}
}
return 0;
}