1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| Program Lwx; Var n, m:longint; edg:array[1..200100, 1..4] of longint; last, first:array[1..5005] of longint; i, j, k, l, a, b, c, ans, top, fv:longint; f:array[1..500100] of longint; dist:array[1..2,1..5005] of longint; past:array[1..5005] of boolean;
Begin readln(n, m); for i := 1 to m do begin readln(a, b, c); edg[i*2-1, 1] := a; edg[i*2-1, 2] := c; edg[i*2-1, 4] := b; if first[b] = 0 then first[b] := i*2 - 1 else edg[last[b], 3] := i*2 - 1; last[b] := i*2 - 1; edg[i*2, 1] := b; edg[i*2, 2] := c; edg[i*2, 4] := a; if first[a] = 0 then first[a] := i*2 else edg[last[a], 3] := i*2; last[a] := i*2; end;
for a := 1 to 2 do begin fillchar(dist[a], sizeof(dist[a]), $ff); fillchar(past, sizeof(past), true); if a = 1 then begin f[1] := 1; dist[a, 1] := 0; past[1] := false; end else begin f[1] := n; dist[a, n] := 0; past[n] := false; end; i := 0; j := 1; while i < j do begin k := f[i+1]; l := first[k]; while l <> 0 do begin if (dist[a, edg[l, 1]] = -1)or(dist[a, k]+edg[l,2] < dist[a, edg[l, 1]]) then begin dist[a, edg[l, 1]] := dist[a, k] + edg[l, 2]; if past[edg[l, 1]] then begin inc(j); f[j] := edg[l, 1]; past[edg[l, 1]] := false; end; end; l := edg[l, 3]; end; past[k] := true; inc(i); end; end; top := dist[1, n]; ans := maxlongint; for i := 1 to 2*m do begin fv := edg[i, 2] + dist[1, edg[i, 4]] + dist[2, edg[i, 1]]; if (fv <> top)and(fv < ans) then ans := fv; end; write(ans); End.
|