poj 1122||zoj 1053 FDNY to the Rescue!(最短路)

来源:互联网 发布:c语言关键字有哪些 编辑:程序博客网 时间:2024/06/02 00:11

poj上过了,但zoj上SF到吐。

求路过的大牛指点一二。


#include<iostream>#include <cstdio>#include <string.h>#include<stdlib.h>#define inf 1000000using namespace std;typedef struct fd{int org,dest,time,path[25];}fd;int cmp( const void *a , const void *b ) { struct fd *c = (fd *)a; struct fd *d = (fd *)b; return c->time - d->time;  }int main(){int T,N,M,i,k,j,v0,u,temp;fd ff[25];int a[25][25],S[25],pre[25],min[25],shortest[25];cin>>T;while(T--){cin>>N;for(i=1;i<=N;i++)for(j=1;j<=N;j++){cin>>a[i][j];if(a[i][j]==-1) a[i][j]=inf;}int len=0;cin>>M;while(~scanf("%d",&v0)){ff[len].dest=M;ff[len].time=0;ff[len].org=v0;ff[len].path[v0]=-1;for(i=1;i<=N;i++){S[i]=0;min[i]=a[v0][i];if(i!=v0&&min[i]<inf)  pre[i]=v0;else pre[i]=-1;}S[v0]=1;min[v0]=0;for(i=1;i<=N;i++){u=v0,temp=inf;for(j=1;j<=N;j++){if(!S[j]&&temp>min[j])u=j,temp=min[j];}S[u]=1;for(k=1;k<=N;k++){if(!S[k]&&a[u][k]<inf&&min[k]>min[u]+a[u][k])pre[k]=u,min[k]=min[u]+a[u][k];}}ff[len].time=min[M];memset(shortest,0,sizeof(shortest));k=0;shortest[k]=M;while(pre[shortest[k]]!=-1){k++;shortest[k]=pre[shortest[k-1]];}for(i=0;i<=k;i++)ff[len].path[i]=shortest[k-i];len++;}qsort(ff,len,sizeof(ff[0]),cmp);printf("Org     Dest    Time    Path\n");for(i=0;i<len;i++){printf("%d\t%d\t%d\t",ff[i].org,ff[i].dest,ff[i].time);for(j=0;ff[i].path[j]!=M;j++)printf("%d\t",ff[i].path[j]);printf("%d\n",M);}}return 0;}