這個演算法很簡單,但是逾時: var n,m,i,x,y:longint; f:array[1..1000,1..1000] of boolean; procedure floyd; var k,i,j:longint; begin for k:=1 to n do for i:=1 to n do for j:=1 to n do f[i,j]:=f[i,j] or (f[i,k] and f[k,j]); end; begin fillchar(f,sizeof(f),false); read(n,m); for i:=1 to m do begin read(x,y); f[x,y]:=true; end; floyd; for i:=1 to n do if f[i,i] then writeln('T') else write('F'); end. 簡單的深搜仍然逾時: var n,m,a,b,i,d:longint; f:array[1..1000,1..1000] of boolean; used:array[1..1000] of boolean; flag:boolean; procedure search(x:longint;var d:longint); var k:longint; begin if (x=i) and (d>0) and (not flag) then begin writeln('T'); flag:=true; exit; end; for k:=1 to n do if (f[x,k]) and (not used[k]) then begin used[k]:=true; inc(d); search(k,d); used[k]:=false;{去掉這一句還是逾時,只能8個點,不要回溯} end; end; begin fillchar(f,sizeof(f),false); read(n,m); for i:=1 to m do begin read(a,b); f[a,b]:=true; end; for i:=1 to n do begin fillchar(used,sizeof(used),false); flag:=false; d:=0; search(i,d); if not flag then writeln('F'); end; end. 弱弱地:還是用鄰接鏈表存邊吧。。。