Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
RE到死啊!求大牛解答啊!Var n, m, l, time, ans, top, Test:longint; pre, other, opp:array[0..400005] of longint; vis:array[0..400005] of boolean; edge:array[0..200005,0..1] of longint; last, f, fa, depth, dfn, low, zt, color:array[0..100005] of longint; v:array[0..100005] of boolean; procedure Add_edge(p, q:longint); begin inc(l); pre[l] := last[p]; last[p] := l; other[l] := q; opp[l] := l + 1; inc(l); pre[l] := last[q]; last[q] := l; other[l] := p; opp[l] := l - 1; end; Procedure Init; var i, p ,q:longint; begin l := 0; Fillchar(last, sizeof(last), 0); for i := 1 to m do begin read(p, q); edge[i][0] := p; edge[i][1] := q; Add_edge(p, q); end; end; Procedure Tarjan(p:longint); var q:longint; begin inc(time); dfn[p] := time; low[p] := time; inc(top); zt[top] := p; v[p] := true; q := last[p]; while q <> 0 do begin if vis[q] then begin q := pre[q]; continue; end; if dfn[other[q]] = -1 then begin vis[opp[q]] := true; Tarjan(other[q]); if low[other[q]] < low[p] then low[p] := low[other[q]]; if low[other[q]] > dfn[p] then begin inc(ans); while zt[top] <> p do begin color[zt[top]] := ans; v[zt[top]] := false; dec(top); end; end; end else if dfn[other[q]] < low[p] then low[p] := dfn[other[q]]; q := pre[q]; end; end; Procedure Dfs(p, father:longint); var q:longint; begin depth[p] := depth[father] + 1; q := last[p]; while q <> 0 do begin if other[q] <> father then begin fa[other[q]] := p; Dfs(other[q], p); end; q := pre[q]; end; end; Function getf(x:longint):longint; begin if f[x] = x then exit(x); f[x] := getf(f[x]); exit(f[x]); end; Procedure Lca(a, b:longint); var x, y:longint; begin x := getf(a); y := getf(b); while x <> y do if depth[x] > depth[y] then begin if not v[x] then begin v[x] := true; dec(ans); end; f[x] := getf(fa[x]); x := getf(x); end else begin if not v[y] then begin v[y] := true; dec(ans); end; f[y] := getf(fa[y]); y := getf(y); end; end; Procedure Main; var i, query, p, q:longint; begin Fillchar(dfn, sizeof(dfn), 255); Fillchar(vis, sizeof(vis), 0); time := 0; ans := 0; top := 0; Tarjan(1); if top > 0 then begin while top > 0 do begin color[zt[top]] := ans + 1; dec(top); end; end; l := 0; Fillchar(last, sizeof(last), 0); for i := 1 to m do if color[edge[i][0]] <> color[edge[i][1]] then Add_edge(color[edge[i][0]], color[edge[i][1]]); Dfs(1, 0); Fillchar(v, sizeof(v), 0); for i := 1 to n do f[i] := i; writeln('Case ', Test, ':'); read(query); for i := 1 to query do begin read(p, q); Lca(color[p], color[q]); writeln(ans); end; end; Begin read(n, m); while (n <> 0) and (m <> 0) do begin inc(Test); Init; Main; writeln; read(n, m); end; End. Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator