POJ1122 & ZOJ1053[FDNY to the Rescue!]
这道题好BT的数据,竟然有两个点距离为0的情况……
大体意思就是说计算每个消防站离火警位置的最短距离并且输出路径,注意输出的格式为time递增并且中间用tab缩进~
同时说明,ZOJ的编译器版本会输出CE,不知道为神马……还有ZOJ是有多组数据的
Const maxn=100; Type lzy=array[0..maxn,0..maxn]of longint; zj=array[0..maxn]of longint; Var map:array[1..maxn,0..maxn]of longint; dis,q,last,opt:array[0..maxn]of longint; ans:lzy; vis:array[1..maxn]of boolean; n,t,i,tail,j:longint; Procedure init; var i,j:longint; begin fillchar(map,sizeof(map),$3f); readln(n); fillchar(ans,sizeof(ans),0); for i:=1 to n do begin for j:=1 to n do begin read(map[i,j]); if map[i,j]<=-1 then map[i,j]:=maxlongint shr 1; end; readln; end; read(t); tail:=0; while not eof do begin inc(tail); read(q[tail]); end; readln; dec(tail); end; Procedure dijkstra(s:longint); var i,j,min,minx:longint; begin fillchar(last,sizeof(last),0); fillchar(dis,sizeof(dis),$3f); fillchar(vis,sizeof(vis),false); for i:=1 to n do begin dis[i]:=map[s,i]; last[i]:=s; end; last[s]:=0; dis[s]:=0; for i:=1 to n-1 do begin min:=maxlongint; for j:=1 to n do if not vis[j] and (dis[j]<min) then begin min:=dis[j]; minx:=j; end; vis[minx]:=true; for j:=1 to n do if not vis[j] and (dis[j]>dis[minx]+map[minx,j]) then begin dis[j]:=dis[minx]+map[minx,j]; last[j]:=minx; end; end; end; Procedure enque(i,x:longint); begin inc(ans[i,0]); ans[i,ans[i,0]]:=x; end; Procedure printlast(y,x:longint); var k,sum,i:longint; begin k:=x; sum:=0; while k<>0 do begin inc(sum); opt[sum]:=k; k:=last[k]; end; for i:=sum downto 1 do enque(y,opt[i]); end; Procedure qsort(l,r:longint); var i,j,x:longint; y:zj; begin i:=l;j:=r;x:=ans[(l+r)shr 1,3]; Repeat while ans[i,3]<x do inc(i); while ans[j,3]>x do dec(j); if i<=j then begin y:=ans[i];ans[i]:=ans[j];ans[j]:=y; inc(i);dec(j); end; Until i>j; if i<r then qsort(i,r); if l<j then qsort(l,j); end; Begin init; for i:=1 to tail do begin dijkstra(q[i]); enque(i,q[i]); enque(i,t); enque(i,dis[t]); printlast(i,t); end; writeln('Org',chr(9),'Dest',chr(9),'Time',chr(9),'Path'); qsort(1,tail); for i:=1 to tail do begin for j:=1 to ans[i,0] do write(ans[i,j],chr(9)); writeln; end; End.