Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Re:RE到死啊!求大牛解答啊!

Posted by 1340502116 at 2016-01-28 15:51:24 on Problem 3694
In Reply To:RE到死啊!求大牛解答啊! Posted by:zdf615328619 at 2011-12-23 23:31:17
> 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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator