记录编号 45049 评测结果 AAAAAAAAAA
题目名称 [顾研NOIP] 旅游电车 最终得分 100
用户昵称 Gravatar天下第一的吃货殿下 是否通过 通过
代码语言 Pascal 运行时间 0.403 s
提交时间 2012-10-22 08:17:32 内存使用 0.64 MiB
显示代码纯文本
var
  a,b,c,d,e,n,m,top,time:longint;
  qq:array[0..5001,0..51] of integer;
  gs,stack,ft,mint:array[0..5001] of integer;
  pd1,jl,pd2:array[0..5001] of boolean;
   function min(xx,yy:longint):longint;
         begin
            if xx<yy then exit(xx)
              else exit(yy);
   end;
   procedure ss(nn:integer);
    var
      i,j,k:longint;
         begin
            pd1[nn]:=true;
            pd2[nn]:=true;
            inc(top);
            stack[top]:=nn;
            inc(time);
            ft[nn]:=time;
            mint[nn]:=time;
               for i:=1 to gs[nn] do
                   begin
                      if (pd1[qq[nn,i]]=false) then ss(qq[nn,i]);
                   if pd2[qq[nn,i]] then mint[nn]:=min(mint[nn],mint[qq[nn,i]]);
               end;
         if mint[nn]=ft[nn] then begin
         j:=0;
         k:=top;
                  while (stack[k+1]<>nn) and (j=0) do
                       begin
                         for i:=1 to gs[stack[k]] do
                           begin
                            if pd2[qq[stack[k],i]]=false then begin
                              j:=1;
                               break;
                               end;
                              end;
                              dec(k);
                           end;
                  while stack[top+1]<>nn do
                       begin
                          pd2[stack[top]]:=false;
                          if j=0 then jl[stack[top]]:=true;
                          dec(top);
                  end;
         end;
end;
   begin
    assign(input,'buss.in');
     reset(input);
      assign(output,'buss.out');
       rewrite(output);
    read(n);
    while n<>0 do
        begin
             read(m);
          for a:=1 to n do
            begin
             mint[a]:=10000;
               gs[a]:=0;
               jl[a]:=false;
               pd1[a]:=false;
               pd2[a]:=false;
             end;
             time:=0;
             top:=0;
     for a:=1 to m do
        begin
         read(b,c);
         inc(gs[b]);
         qq[b,gs[b]]:=c;
        end;
      for a:=1 to n do
         if pd1[a]=false then ss(a);
    for a:=1 to n do
      if jl[a] then write(a,' ');
       read(n);
      end;
        close(input);
         close(output);
   end.