1506传话

本文探讨了两种图遍历算法——Floyd算法与深度优先搜索(DFS),并针对这两种算法在解决图论问题时遇到的时间效率问题进行了分析。通过具体代码示例展示了如何使用邻接矩阵进行节点可达性判断,并提出了采用邻接链表来提高算法效率的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个算法很简单,但是超时:
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.
弱弱地:还是用邻接链表存边吧。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值