http://acm.pku.edu.cn/JudgeOnline/problem?id=1062
Код:
program PKU1062; {$S-,Q-,R-,I-} const inf = ''; ouf = ''; maxn = 101; none = maxlongint shr 1; type integer = longint; var cost: array[1..maxn, 1..maxn] of integer; lev, dis: array[1..maxn] of integer; x: array[1..maxn] of boolean; s, n, m: integer; function min(i, j: integer): integer; begin if i < j then min := i else min := j; end; procedure prepare; var i, j, u, p, k: integer; begin read(m, n); s := n + 1; for i := 1 to s do for j := 1 to s do cost[i, j] := none; for i := 1 to n do begin read(p, lev[i], k); cost[s, i] := p; for j := 1 to k do begin read(u, p); cost[u, i] := p; end; end; end; function dij(low: integer): integer; var u, i: integer; begin for i := 1 to n do dis[i] := none; dis[s] := 0; for i := 1 to n do x[i] := (lev[i] >= low) and (lev[i] - low <= m); u := s; while x[1] do begin x[u] := false; for i := 1 to n do if x[i] then dis[i] := min(dis[i], dis[u] + cost[u, i]); u := 0; for i := 1 to n do if x[i] and ((u = 0) or (dis[i] < dis[u])) then u := i; end; dij := dis[1]; end; procedure main; var i, ans: integer; begin ans := none; for i := 1 to n do ans := min(ans, dij(lev[i])); writeln(ans); end; begin assign(input, inf); assign(output, ouf); reset(input); rewrite(output); prepare; main; close(input); close(output); end.