To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.
root / _FullBNT / BNT / graph / acyclic.m @ 8:b5b38998ef3b
History | View | Annotate | Download (635 Bytes)
| 1 |
function b = acyclic(adj_mat, directed) |
|---|---|
| 2 |
% ACYCLIC Returns true iff the graph has no (directed) cycles. |
| 3 |
% b = acyclic(adj_mat, directed) |
| 4 |
|
| 5 |
adj_mat = double(adj_mat); |
| 6 |
if nargin < 2, directed = 1; end |
| 7 |
|
| 8 |
% e.g., G = |
| 9 |
% 1 -> 3 |
| 10 |
% | |
| 11 |
% v |
| 12 |
% 2 <- 4 |
| 13 |
% In this case, 1->2 in the transitive closure, but 1 cannot get to itself. |
| 14 |
% If G was undirected, 1 could get to itself, but this graph is not cyclic. |
| 15 |
% So we cannot use the closure test in the undirected case. |
| 16 |
|
| 17 |
if directed |
| 18 |
R = reachability_graph(adj_mat); |
| 19 |
b = ~any(diag(R)==1); |
| 20 |
else |
| 21 |
[d, pre, post, cycle] = dfs(adj_mat,[],directed); |
| 22 |
b = ~cycle; |
| 23 |
end |