ssl2339 分糖果 spfa
题目大意
给一个无向图(点数1<=n<=100000 ),求从起点到那一个点的最短路最长,并输出路径长度。
分析
就是一个赤裸裸的spfa吗!
代码
const maxe=100000; maxv=2000000; type arr=record x,y,w,next:longint; end; var n,m,s,q:longint; ls:array[1..maxe] of longint; a:array[1..maxv] of arr; f:array[1..maxe] of longint; v:array[1..maxe] of longint; d:array[1..maxe] of longint; i,j,k:longint; ans:longint; procedure spfa; var i,j,k:longint; head,tail:longint; begin fillchar(f,sizeof(f),$7f); head:=0; tail:=1; v[s]:=1; d[1]:=s; f[s]:=1; repeat head:=head mod maxe+1; j:=ls[d[head]]; while j<>0 do begin with a[j] do begin if f[x]+w<f[y] then begin f[y]:=f[x]+w; if v[y]=0 then begin tail:=tail mod maxe+1; d[tail]:=y; v[y]:=1; end; end; j:=next; end; end; v[d[head]]:=0; until head=tail; end; begin assign(input,'spfa.in'); assign(output,'spfa.out'); rewrite(output); reset(input); readln(n,m,s); readln(q); fillchar(ls,sizeof(ls),0); for i:=1 to m do begin with a[i*2-1] do begin readln(x,y); w:=1; next:=ls[x]; ls[x]:=i*2-1; end; a[i*2].x:=a[i*2-1].y; a[i*2].y:=a[i*2-1].x; a[i*2].w:=1; a[i*2].next:=ls[a[i*2].x]; ls[a[i*2].x]:=i*2; end; spfa; ans:=0; for i:=1 to n do if f[i]>ans then ans:=f[i]; write(ans+q); close(input); close(output); end.