Программа  9 с.101                       Кирсанов М.Н, 
Графы в Maple

Транзитивное замыкание

>    restart: with(LinearAlgebra): n:=4:

>    A:=Matrix([[1,0,0,1],[1,0,0,0],[0,0,0,0],[0,0,1,1]]);

>    `IsMatrixShape/trnztv` := proc(A)

>    local i,j,m,S:

>    S:=true:

>    for i to n do

>     for j to n do

>      for m to n do

>       if(A[i,m]*A[m,j]=1) then S:= S and is(A[i,j]=1);fi;

>      od;

>     od;

>    od:

>    end:

>    IsMatrixShape(A,trnztv);#Проверка транзитивности

A := Matrix(%id = 150604492)

false

>    if IsMatrixShape(A,symmetric) then print("Неограф") else print("Орграф"); fi;

>    if Trace(A)=n then print("Граф рефлексивного отношения");fi;

>    if Trace(A)=0 then print("Граф антирефлексивного отношения");fi;

>    if IsMatrixShape(A,zero) then print("Пустой граф"); fi;

>    A:=subs(1=true,0=false,A);

A := Matrix(%id = 150604876)

>    for m to n do #Алгоритм Уоршолла

>     for i to n do

>      for j to n do

>       A[i,j]:=A[i,j] or (A[i,m] and  A[m,j]);

>      od;

>     od;

>    od;

>    A:=subs(true=1,false=0,A);

>    IsMatrixShape(A,trnztv);#Проверка транзитивности

A := Matrix(%id = 150605004)

true