我现在碰到一个关于数据流的问题,数据流相当一个有向图,为了防止出现"死锁",
也就是说有向图中不能有"回路".有向图可用一个矩阵表示,  问题就是怎样通过这个矩阵来判断这个有向图中是否存在"回路"?
我想知道通过怎样的矩阵运算可以判断,
如果可以希望能提供算法(C,PASCAL描述都可以).
事情紧急,望各位高人指教,可以另外再加分

解决方案 »

  1.   

    我的一种算法:原程序以后给出。步骤:
      1、考察,节点1和其他节点的是否存在直接环,直接环就是1指向K,K指向1,同时考察节点1是否自环。没有再进行下一步,有的话,则表明存在环,退出。
      2、合并,1和2节点,从新编号,重复步骤1,直到剩下一个节点,合并的时候去掉1和2之间的直接联系。矩阵的算法:  考察自环,就是考察对角线上面是否存在1。假定:有向图存放,1表示存在关系,0表示无。  考察直接环,就是考察是否存在对称的值。  合并算法,合并纵行和横行,去掉任何1或者2的值,保留其他值。
    我把以上算法称为,合并矩阵行算法,效率应该是最好的了。算法的Delphi源程序,后面给出。
      

  2.   

    谢谢 BlueTrees(蜗牛) 
    希望能看到你的Delphi源程序
      

  3.   

    TSqr = class
      private
        FCount:Integer;
        function Check:Boolean;
        procedure Reduce;
      public
        FSqr:array of array of Integer;
        constructor Create(count:Integer);reintroduce;
        destructor Destroy;override;
        function CheckAll:Boolean;
      end;{ TSqr }function TSqr.Check: Boolean;
    var
      I:Integer;
    begin
      Result:=True;
      for I:=0 to Fcount-1 do
       if (FSqr[I,I]=1) then
       begin
         Result:=False;
         break;
       end;
    end;function TSqr.CheckAll:Boolean;
    begin
      Result:=True;
      while FCount>0 do
      begin
        Result:=Check;
        if not Result then
          break
        else
          Reduce;
      end;
    end;constructor TSqr.Create(count: Integer);
    begin
      inherited Create;
      FCount:=Count;
      SetLength(FSqr,count,count);
    end;destructor TSqr.Destroy;
    begin
      finalize(FSqr);
      inherited;
    end;procedure TSqr.Reduce;
    var
      I,J:Integer;
    begin
      for I:=0 to FCount-2 do
        if FSqr[I,FCount-1]=1 then
          for J:=0 to FCount-2 do
            FSqr[I,J]:=FSqr[I,J] or FSqr[Fcount,J];
      Dec(FCount);
    end;说明:我修正了上面的算法,我把合并修正为去掉节点,
    去掉节点的时候,把出的目标和这个被去掉的节点的源节点直接相连,还有上面的类仅仅表达了算法,从一个封装的角度来说是不完备的。
      

  4.   

    CheckALL是检查整个矩阵,检查过后,矩阵被破坏了。