var v,f,yes:array[1..1000]of boolean; dfn,low:array[1..1000]of integer; a:array[0..1000,0..1000]of integer; b:array [0..1000] of integer; i,j,n,m,x,y,deep,d:integer; stack,ln:array[1..1000]of integer; function min(x,y:longint):integer; begin if x>y then exit(y) else exit(x); end; procedure print(x:integer); var i:longint; begin i:=0;fillchar(b,sizeof(b),0); while stack[deep]<>x do begin inc(i); b[i]:=stack[deep]; f[stack[deep]]:=false; dec(deep); end; f[stack[deep]]:=false; dec(deep); inc(i);b[i]:=x; if i>1 then for x:=1 to i do yes[b[x]]:=true; end; procedure dfs(x:integer); var i:integer; begin inc(d); //时间 dfn[x]:=d; //规则1 low[x]:=d; inc(deep); //栈中元素个数 stack[deep]:=x; //规则2 f[x]:=true; for i:=1 to a[x,0] do if dfn[a[x,i]]=0 then begin dfs(a[x,i]); low[x]:=min(low[a[x,i]],low[x]); //规则3 end else if f[a[x,i]] then low[x]:=min(low[x],dfn[a[x,i]]); //规则4 dfn or low 有影响吗? if dfn[x]=low[x] then //规则5 print(x); end; begin assign(input,'messagez.in'); reset(input); assign(output,'messagez.out'); rewrite(output); readln(n,m); fillchar(a,sizeof(a),0); fillchar(yes,sizeof(yes),false); fillchar(dfn,sizeof(dfn),0); for i:=1 to m do begin readln(x,y); inc(a[x,0]); a[x,a[x,0]]:=y; end; for i:=1 to n do if dfn[i]=0 then dfs(i); for i:=1 to n do if yes[i] then writeln('T') else writeln('F'); close(input);close(output); end.
【强联通分量】
猜你喜欢
转载自1260535207.iteye.com/blog/2285510
今日推荐
周排行