| 
 | 
back to boardHELPPPPPPPP. TL PLEASE var ni,k,i,j,max,m,n:longint;     a,b:array [1..25001] of integer;     q:array [1..1001] of byte;     s:boolean;   begin   readln (k);   for j:=1 to k do     begin       readln (n);       for i:=1 to n do         begin           if i<>n then             read (a[i])           else             readln (a[i]);           if a[i]<>0 then             inc (b[a[i]]);         end;       max:=b[1];       for i:=2 to n do         if max<b[i] then           max:=b[i];       for i:=1 to n do         if (b[i]=max) then           inc (m);       ni:=0;       if m=1 then         begin           q[j]:=1;           s:=true;         end       else         for i:=1 to n do           if (a[i]=0)and(b[i]<>0) then             begin               q[j]:=1;               if ni=1 then                 begin                   q[j]:=0;                   break;                 end;               inc (ni);               s:=true;             end;       if not s then         q[j]:=0;       s:=false;       fillchar(a,sizeof(a),0);       fillchar(b,sizeof(b),0);     end;   for i:=1 to k do     if q[i]=1 then       writeln ('YES')     else       writeln ('NO'); end.   Re: HELPPPPPPPP. TL PLEASE You need to use the O(n) algo. Here is my AC solution. It checks if the graph is the tree. If is then YES.     program Collective_Guarantee; const MaxN=25000; label fin; type List=array[1..MaxN] of Integer; var  Tree,Sign:List;      N,i,j,z,K,M,m1:integer;      res:boolean; begin      readln(M); for m1:=1 to M do begin readln(N);      z:=0;      res:=true;      for i:=1 to N do      begin           read(Tree[i]);           if Tree[i]=0 then             inc(z);      end;      if z<>1 then      begin           res:=false;           goto fin;      end else      begin            FillChar(Sign,SizeOf(Sign),0);           K:=0;           while true do           begin                i:=1;                inc(K);                  while (Sign[i]>0) and (i<=N) do                   inc(i);                if i<>N+1 then                begin                        while i<>0 do                        begin                          if Sign[i]=0 then                             Sign[i]:=K else                          if Sign[i]=K then                          begin                               res:=false;                               goto fin;                          end else                          if Sign[i]<K then                            i:=0;                          if i<>0 then                            i:=Tree[i];                     end;                end else                 goto fin;            end;      end; fin: if res=false then         writeln('NO') else         writeln('YES'); end; end.  |  
  | 
|