【强联通分量】



     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
今日推荐