我现在碰到一个关于数据流的问题,数据流相当一个有向图,为了防止出现"死锁",
也就是说有向图中不能有"回路".有向图可用一个矩阵表示, 问题就是怎样通过这个矩阵来判断这个有向图中是否存在"回路"?
我想知道通过怎样的矩阵运算可以判断,
如果可以希望能提供算法(C,PASCAL描述都可以).
事情紧急,望各位高人指教,可以另外再加分
也就是说有向图中不能有"回路".有向图可用一个矩阵表示, 问题就是怎样通过这个矩阵来判断这个有向图中是否存在"回路"?
我想知道通过怎样的矩阵运算可以判断,
如果可以希望能提供算法(C,PASCAL描述都可以).
事情紧急,望各位高人指教,可以另外再加分
1、考察,节点1和其他节点的是否存在直接环,直接环就是1指向K,K指向1,同时考察节点1是否自环。没有再进行下一步,有的话,则表明存在环,退出。
2、合并,1和2节点,从新编号,重复步骤1,直到剩下一个节点,合并的时候去掉1和2之间的直接联系。矩阵的算法: 考察自环,就是考察对角线上面是否存在1。假定:有向图存放,1表示存在关系,0表示无。 考察直接环,就是考察是否存在对称的值。 合并算法,合并纵行和横行,去掉任何1或者2的值,保留其他值。
我把以上算法称为,合并矩阵行算法,效率应该是最好的了。算法的Delphi源程序,后面给出。
希望能看到你的Delphi源程序
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;说明:我修正了上面的算法,我把合并修正为去掉节点,
去掉节点的时候,把出的目标和这个被去掉的节点的源节点直接相连,还有上面的类仅仅表达了算法,从一个封装的角度来说是不完备的。