Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 18 additions & 17 deletions doc/attr.xml
Original file line number Diff line number Diff line change
Expand Up @@ -1579,43 +1579,44 @@ gap> FacialWalks(D3, rot);
</ManSection>
<#/GAPDoc>

<#GAPDoc Label="HamiltonianPath">
<#GAPDoc Label="HamiltonianCycle">
<ManSection>
<Attr Name="HamiltonianPath" Arg="digraph"/>
<Attr Name="HamiltonianCycle" Arg="digraph"/>
<Returns>A list or <K>fail</K>.</Returns>
<Description>
Returns a Hamiltonian path if one exists, <K>fail</K> if not.<P/>
For a digraph <A>digraph</A>, this attribute returns a Hamiltonian cycle,
if one exists, and <K>fail</K> if one does not.<P/>

A <E>Hamiltonian path</E> of a digraph with <C>n</C> vertices is directed
A <E>Hamiltonian cycle</E> of a digraph with <C>n</C> vertices is a directed
cycle of length <C>n</C>. If <A>digraph</A> is a digraph that contains a
Hamiltonian path, then this function returns one, described in the form
used by <Ref Attr="DigraphAllSimpleCircuits"/>. Note if <A>digraph</A> has
0 or 1 vertices, then <C>HamiltonianPath</C> returns <C>[]</C> or
Hamiltonian cycle, then this function returns one, described in the form
used by <Ref Attr="DigraphAllSimpleCircuits"/>. Note that if <A>digraph</A>
has 0 or 1 vertices, then <Ref Attr="HamiltonianCycle"/> returns <C>[]</C> or
<C>[1]</C>, respectively.<P/>

The method used in this attribute has the same worst case complexity as
<Ref Oper="DigraphMonomorphism"/>.

<Example><![CDATA[
gap> D := Digraph([[]]);
gap> D := EmptyDigraph(1);
<immutable empty digraph with 1 vertex>
gap> HamiltonianPath(D);
gap> HamiltonianCycle(D);
[ 1 ]
gap> D := Digraph([[2], [1]]);
<immutable digraph with 2 vertices, 2 edges>
gap> HamiltonianPath(D);
gap> D := CycleDigraph(2);
<immutable cycle digraph with 2 vertices>
gap> HamiltonianCycle(D);
[ 1, 2 ]
gap> D := Digraph([[3], [], [2]]);
<immutable digraph with 3 vertices, 2 edges>
gap> HamiltonianPath(D);
gap> HamiltonianCycle(D);
fail
gap> D := Digraph([[2], [3], [1]]);
<immutable digraph with 3 vertices, 3 edges>
gap> HamiltonianPath(D);
gap> D := CycleDigraph(3);
<immutable cycle digraph with 3 vertices>
gap> HamiltonianCycle(D);
[ 1, 2, 3 ]
gap> D := GeneralisedPetersenGraph(IsMutableDigraph, 5, 2);
<mutable digraph with 10 vertices, 30 edges>
gap> HamiltonianPath(D);
gap> HamiltonianCycle(D);
fail
]]></Example>
</Description>
Expand Down
2 changes: 1 addition & 1 deletion doc/examples.xml
Original file line number Diff line number Diff line change
Expand Up @@ -1064,7 +1064,7 @@ gap> D := CirculantGraph(6, [2, 3]);
with 6 vertices, 18 edges>
gap> AutomorphismGroup(D) = DihedralGroup(IsPermGroup, 12);
true
gap> HamiltonianPath(D);
gap> HamiltonianCycle(D);
[ 1, 3, 5, 2, 6, 4 ]
gap> IsCompleteDigraph(CirculantGraph(6, [1, 2, 3]));
true]]></Example>
Expand Down
20 changes: 10 additions & 10 deletions doc/prop.xml
Original file line number Diff line number Diff line change
Expand Up @@ -956,21 +956,21 @@ true
&MUTABLE_RECOMPUTED_PROP;

<Example><![CDATA[
gap> g := Digraph([[]]);
gap> D := EmptyDigraph(1);
<immutable empty digraph with 1 vertex>
gap> IsHamiltonianDigraph(g);
gap> IsHamiltonianDigraph(D);
true
gap> g := Digraph([[2], [1]]);
<immutable digraph with 2 vertices, 2 edges>
gap> IsHamiltonianDigraph(g);
gap> D := CycleDigraph(2);
<immutable cycle digraph with 2 vertices>
gap> IsHamiltonianDigraph(D);
true
gap> g := Digraph([[3], [], [2]]);
gap> D := Digraph([[3], [], [2]]);
<immutable digraph with 3 vertices, 2 edges>
gap> IsHamiltonianDigraph(g);
gap> IsHamiltonianDigraph(D);
false
gap> g := Digraph([[2], [3], [1]]);
<immutable digraph with 3 vertices, 3 edges>
gap> IsHamiltonianDigraph(g);
gap> D := CycleDigraph(3);
<immutable cycle digraph with 3 vertices>
gap> IsHamiltonianDigraph(D);
true
]]></Example>
</Description>
Expand Down
2 changes: 1 addition & 1 deletion doc/z-chap4.xml
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@
<#Include Label="DigraphLayers">
<#Include Label="DigraphDegeneracy">
<#Include Label="DigraphDegeneracyOrdering">
<#Include Label="HamiltonianPath">
<#Include Label="HamiltonianCycle">
<#Include Label="NrSpanningTrees">
<#Include Label="DigraphDijkstra">
<#Include Label="DigraphCycleBasis">
Expand Down
2 changes: 1 addition & 1 deletion gap/attr.gd
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ DeclareOperation("DigraphAllChordlessCyclesOfMaximalLength",
[IsDigraph, IsInt]);
DeclareAttribute("DigraphAllChordlessCycles", IsDigraph);
DeclareOperation("FacialWalks", [IsDigraph, IsList]);
DeclareAttribute("HamiltonianPath", IsDigraph);
DeclareAttribute("HamiltonianCycle", IsDigraph);
DeclareAttribute("DigraphPeriod", IsDigraph);
DeclareAttribute("DigraphLoops", IsDigraph);

Expand Down
2 changes: 1 addition & 1 deletion gap/attr.gi
Original file line number Diff line number Diff line change
Expand Up @@ -2267,7 +2267,7 @@ function(D)
return Determinant(mat);
end);

InstallMethod(HamiltonianPath, "for a digraph", [IsDigraph],
InstallMethod(HamiltonianCycle, "for a digraph", [IsDigraph],
function(D)
local path, iter, n;

Expand Down
7 changes: 4 additions & 3 deletions gap/prop.gi
Original file line number Diff line number Diff line change
Expand Up @@ -605,11 +605,12 @@ function(D)
return true;
fi;
fi;
return HamiltonianPath(D) <> fail;
return HamiltonianCycle(D) <> fail;
end);

InstallMethod(IsHamiltonianDigraph, "for a digraph with hamiltonian path",
[IsDigraph and HasHamiltonianPath], x -> HamiltonianPath(x) <> fail);
InstallMethod(IsHamiltonianDigraph,
"for a digraph with known hamiltonian cycle",
[IsDigraph and HasHamiltonianCycle], x -> HamiltonianCycle(x) <> fail);

InstallMethod(IsDigraphCore, "for a digraph",
[IsDigraph],
Expand Down
8 changes: 4 additions & 4 deletions tst/extreme/attr.tst
Original file line number Diff line number Diff line change
Expand Up @@ -41,20 +41,20 @@ gap> circs := DigraphAllSimpleCircuits(gr);;
gap> Length(circs);
1291792

# HamiltonianPath and IsHamiltonianDigraph
# HamiltonianCycle and IsHamiltonianDigraph
gap> g := CompleteDigraph(20);
<immutable complete digraph with 20 vertices>
gap> HamiltonianPath(g);
gap> HamiltonianCycle(g);
[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 ]
gap> IsDigraphMonomorphism(CycleDigraph(20),
> g,
> Transformation(HamiltonianPath(g)));
> Transformation(HamiltonianCycle(g)));
true
gap> IsHamiltonianDigraph(g);
true
gap> g := CompleteMultipartiteDigraph([1, 9, 1, 1, 2, 1, 1, 1]);
<immutable complete multipartite digraph with 17 vertices, 198 edges>
gap> HamiltonianPath(g);
gap> HamiltonianCycle(g);
fail
gap> IsHamiltonianDigraph(g);
false
Expand Down
56 changes: 28 additions & 28 deletions tst/standard/attr.tst
Original file line number Diff line number Diff line change
Expand Up @@ -2237,110 +2237,110 @@ gap> ForAll(D,
> d -> DigraphNrEdges(d) / 2 = DigraphNrEdges(StrongOrientation(d)));
true

# HamiltonianPath
# HamiltonianCycle
gap> g := Digraph([]);
<immutable empty digraph with 0 vertices>
gap> HamiltonianPath(g);
gap> HamiltonianCycle(g);
[ ]
gap> g := Digraph([[]]);
<immutable empty digraph with 1 vertex>
gap> HamiltonianPath(g);
gap> HamiltonianCycle(g);
[ 1 ]
gap> g := Digraph([[], []]);
<immutable empty digraph with 2 vertices>
gap> HamiltonianPath(g);
gap> HamiltonianCycle(g);
fail
gap> g := Digraph([[1]]);
<immutable digraph with 1 vertex, 1 edge>
gap> HamiltonianPath(g);
gap> HamiltonianCycle(g);
[ 1 ]
gap> g := Digraph([[2, 2], []]);
<immutable multidigraph with 2 vertices, 2 edges>
gap> HamiltonianPath(g);
gap> HamiltonianCycle(g);
fail
gap> g := Digraph([[2], [1]]);
<immutable digraph with 2 vertices, 2 edges>
gap> HamiltonianPath(g);
gap> HamiltonianCycle(g);
[ 1, 2 ]
gap> g := Digraph([[3], [3], []]);
<immutable digraph with 3 vertices, 2 edges>
gap> HamiltonianPath(g);
gap> HamiltonianCycle(g);
fail
gap> g := Digraph([[3], [3], [1, 2]]);
<immutable digraph with 3 vertices, 4 edges>
gap> HamiltonianPath(g);
gap> HamiltonianCycle(g);
fail
gap> g := Digraph([[3], [], [2]]);
<immutable digraph with 3 vertices, 2 edges>
gap> HamiltonianPath(g);
gap> HamiltonianCycle(g);
fail
gap> g := Digraph([[2], [3], [1]]);
<immutable digraph with 3 vertices, 3 edges>
gap> HamiltonianPath(g);
gap> HamiltonianCycle(g);
[ 1, 2, 3 ]
gap> g := Digraph([[2], [3], [1], []]);
<immutable digraph with 4 vertices, 3 edges>
gap> HamiltonianPath(g);
gap> HamiltonianCycle(g);
fail
gap> g := Digraph([[2], [3], [1, 4], []]);
<immutable digraph with 4 vertices, 4 edges>
gap> HamiltonianPath(g);
gap> HamiltonianCycle(g);
fail
gap> g := Digraph([[3, 6], [4], [2, 1], [5, 1], [3], [4]]);
<immutable digraph with 6 vertices, 9 edges>
gap> HamiltonianPath(g);
gap> HamiltonianCycle(g);
fail
gap> g := Digraph([[3, 6], [4, 1], [2, 1], [5, 1], [3], [4]]);
<immutable digraph with 6 vertices, 10 edges>
gap> HamiltonianPath(g);
gap> HamiltonianCycle(g);
[ 1, 6, 4, 5, 3, 2 ]
gap> g := Digraph([[3, 6], [4], [2, 1], [5, 1], [3], [4, 7], []]);
<immutable digraph with 7 vertices, 10 edges>
gap> HamiltonianPath(g);
gap> HamiltonianCycle(g);
fail
gap> g := Digraph([[3, 6, 7], [4, 1], [2, 1], [5, 1], [3], [4, 7], [6]]);
<immutable digraph with 7 vertices, 13 edges>
gap> HamiltonianPath(g);
gap> HamiltonianCycle(g);
[ 1, 7, 6, 4, 5, 3, 2 ]
gap> g := Digraph([[3, 6], [4], [2, 1], [5, 1], [3], [4, 7], [6]]);
<immutable digraph with 7 vertices, 11 edges>
gap> HamiltonianPath(g);
gap> HamiltonianCycle(g);
fail
gap> g := Digraph([[5, 6, 10], [2, 9], [3, 7], [2, 3], [9, 10], [2, 9], [1],
> [2, 3, 4, 7, 9], [3, 10], [4, 5, 6, 8]]);
<immutable digraph with 10 vertices, 25 edges>
gap> HamiltonianPath(g);
gap> HamiltonianCycle(g);
fail
gap> g := Digraph([[2, 4, 6, 10], [1, 3, 4, 5, 6, 7, 9, 10], [1, 5, 7, 8],
> [6, 10], [1, 7], [3, 4, 6, 7, 9], [2, 3, 4, 7],
> [2, 4, 5, 6], [2, 3, 5, 6, 7, 9, 10], [2, 3, 5]]);
<immutable digraph with 10 vertices, 43 edges>
gap> HamiltonianPath(g);
gap> HamiltonianCycle(g);
[ 1, 4, 6, 9, 10, 3, 8, 5, 7, 2 ]
gap> IsDigraphMonomorphism(CycleDigraph(10),
> g,
> Transformation(HamiltonianPath(g)));
> Transformation(HamiltonianCycle(g)));
true
gap> g := CompleteMultipartiteDigraph([1, 30]);
<immutable complete bipartite digraph with bicomponent sizes 1 and 30>
gap> HamiltonianPath(g);
gap> HamiltonianCycle(g);
fail
gap> g := Digraph([[2, 5, 6], [3, 1, 7], [4, 2, 8], [5, 3, 9], [1, 4, 10],
> [1, 8, 9], [2, 9, 10], [3, 10, 6], [4, 6, 7], [5, 7, 8]]);
<immutable digraph with 10 vertices, 30 edges>
gap> HamiltonianPath(g);
gap> HamiltonianCycle(g);
fail
gap> g := CompleteMultipartiteDigraph([16, 15]);
<immutable complete bipartite digraph with bicomponent sizes 16 and 15>
gap> HamiltonianPath(g);
gap> HamiltonianCycle(g);
fail
gap> g := CompleteMultipartiteDigraph([1, 15, 1, 1, 1, 1, 1, 1]);
<immutable complete multipartite digraph with 22 vertices, 252 edges>
gap> HamiltonianPath(g);
gap> HamiltonianCycle(g);
fail
gap> g := CycleDigraph(100);
<immutable cycle digraph with 100 vertices>
gap> HamiltonianPath(g);
gap> HamiltonianCycle(g);
[ 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
96, 97, 98, 99, 100, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
Expand All @@ -2353,7 +2353,7 @@ gap> g := DigraphAddEdges(g, [[6, 8], [8, 7], [7, 9]]);
<immutable digraph with 513 vertices, 516 edges>
gap> g := DigraphRemoveEdge(g, [6, 7]);
<immutable digraph with 513 vertices, 515 edges>
gap> HamiltonianPath(g);
gap> HamiltonianCycle(g);
[ 1, 2, 3, 4, 5, 6, 8, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
Expand Down Expand Up @@ -2390,7 +2390,7 @@ gap> HamiltonianPath(g);
gap> gr := DigraphAddEdges(DigraphAddVertex(CycleDigraph(600)),
> [[600, 601], [601, 600]]);
<immutable digraph with 601 vertices, 602 edges>
gap> HamiltonianPath(gr);
gap> HamiltonianCycle(gr);
fail

# DigraphCore
Expand Down
2 changes: 1 addition & 1 deletion tst/standard/prop.tst
Original file line number Diff line number Diff line change
Expand Up @@ -1636,7 +1636,7 @@ true
gap> gr := DigraphAddEdges(DigraphAddVertex(CycleDigraph(600)),
> [[600, 601], [601, 600]]);
<immutable digraph with 601 vertices, 602 edges>
gap> HamiltonianPath(gr);
gap> HamiltonianCycle(gr);
fail
gap> IsHamiltonianDigraph(gr);
false
Expand Down
Loading