吐个槽,第一遍的时候竟然是输出受限制,但结果却是对的,后来删了重新敲了一遍,竟然AC了!坑啊!
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=505;
int mp[maxn][maxn];
int pre[maxn][maxn];
int cost[maxn];
int n;
void init()
{
int i,j;
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
if(i==j)
mp[i][j]=0;
else
mp[i][j]=inf;
}
}
}
void input()
{
int i,j;
int x;
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
scanf("%d",&x);
if(x!=-1)
mp[i][j]=x;
pre[i][j]=j;
}
}
for(i=1; i<=n; i++)
{
scanf("%d",&cost[i]);
}
}
void floyd()
{
int k,i,j;
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]+cost[k])
{
mp[i][j]=mp[i][k]+mp[k][j]+cost[k];
pre[i][j]=pre[i][k];
}
else if(mp[i][j]==(mp[i][k]+mp[k][j]+cost[k]))
{
if(pre[i][j]>pre[i][k])
{
pre[i][j]=pre[i][k];
}
}
}
}
}
}
void ff()
{
int a,b,i;
while(scanf("%d%d",&a,&b))
{
if(a==-1&&b==-1)
break;
printf("From %d to %d :\n",a,b);
printf("Path: %d",a);
i=a;
while(i!=b)
{
printf("-->%d",pre[i][b]);
i=pre[i][b];
}
printf("\n");
printf("Total cost : %d\n",mp[a][b]);
printf("\n");
}
}
int main()
{
while(scanf("%d",&n),n)
{
init();
input();
floyd();
ff();
}
return 0;
}