HDU 1385
来源:互联网 发布:微博营销 seo 编辑:程序博客网 时间:2024/06/05 19:06
吐个槽,第一遍的时候竟然是输出受限制,但结果却是对的,后来删了重新敲了一遍,竟然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;}