summaryrefslogtreecommitdiff
path: root/doc/johnson_cycles.1.html
blob: 225f95ca005d9c5c741bbb6eb1fa1f489f2abb39 (plain)
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
<!DOCTYPE html>
<html>
<head>
  <meta http-equiv='content-type' value='text/html;charset=utf8'>
  <meta name='generator' value='Ronn/v0.7.3 (http://github.com/rtomayko/ronn/tree/0.7.3)'>
  <title>johnson_cycles(1) - Enumerate the simple cycles of a graph</title>
  <style type='text/css' media='all'>
  /* style: man */
  body#manpage {margin:0}
  .mp {max-width:100ex;padding:0 9ex 1ex 4ex}
  .mp p,.mp pre,.mp ul,.mp ol,.mp dl {margin:0 0 20px 0}
  .mp h2 {margin:10px 0 0 0}
  .mp > p,.mp > pre,.mp > ul,.mp > ol,.mp > dl {margin-left:8ex}
  .mp h3 {margin:0 0 0 4ex}
  .mp dt {margin:0;clear:left}
  .mp dt.flush {float:left;width:8ex}
  .mp dd {margin:0 0 0 9ex}
  .mp h1,.mp h2,.mp h3,.mp h4 {clear:left}
  .mp pre {margin-bottom:20px}
  .mp pre+h2,.mp pre+h3 {margin-top:22px}
  .mp h2+pre,.mp h3+pre {margin-top:5px}
  .mp img {display:block;margin:auto}
  .mp h1.man-title {display:none}
  .mp,.mp code,.mp pre,.mp tt,.mp kbd,.mp samp,.mp h3,.mp h4 {font-family:monospace;font-size:14px;line-height:1.42857142857143}
  .mp h2 {font-size:16px;line-height:1.25}
  .mp h1 {font-size:20px;line-height:2}
  .mp {text-align:justify;background:#fff}
  .mp,.mp code,.mp pre,.mp pre code,.mp tt,.mp kbd,.mp samp {color:#131211}
  .mp h1,.mp h2,.mp h3,.mp h4 {color:#030201}
  .mp u {text-decoration:underline}
  .mp code,.mp strong,.mp b {font-weight:bold;color:#131211}
  .mp em,.mp var {font-style:italic;color:#232221;text-decoration:none}
  .mp a,.mp a:link,.mp a:hover,.mp a code,.mp a pre,.mp a tt,.mp a kbd,.mp a samp {color:#0000ff}
  .mp b.man-ref {font-weight:normal;color:#434241}
  .mp pre {padding:0 4ex}
  .mp pre code {font-weight:normal;color:#434241}
  .mp h2+pre,h3+pre {padding-left:0}
  ol.man-decor,ol.man-decor li {margin:3px 0 10px 0;padding:0;float:left;width:33%;list-style-type:none;text-transform:uppercase;color:#999;letter-spacing:1px}
  ol.man-decor {width:100%}
  ol.man-decor li.tl {text-align:left}
  ol.man-decor li.tc {text-align:center;letter-spacing:4px}
  ol.man-decor li.tr {text-align:right;float:right}
  </style>
  <style type='text/css' media='all'>
  /* style: toc */
  .man-navigation {display:block !important;position:fixed;top:0;left:113ex;height:100%;width:100%;padding:48px 0 0 0;border-left:1px solid #dbdbdb;background:#eee}
  .man-navigation a,.man-navigation a:hover,.man-navigation a:link,.man-navigation a:visited {display:block;margin:0;padding:5px 2px 5px 30px;color:#999;text-decoration:none}
  .man-navigation a:hover {color:#111;text-decoration:underline}
  </style>
</head>
<!--
  The following styles are deprecated and will be removed at some point:
  div#man, div#man ol.man, div#man ol.head, div#man ol.man.

  The .man-page, .man-decor, .man-head, .man-foot, .man-title, and
  .man-navigation should be used instead.
-->
<body id='manpage'>
  <div class='mp' id='man'>

  <div class='man-navigation' style='display:none'>
    <a href="#NAME">NAME</a>
    <a href="#SYNOPSIS">SYNOPSIS</a>
    <a href="#DESCRIPTION">DESCRIPTION</a>
    <a href="#PARAMETERS">PARAMETERS</a>
    <a href="#OUTPUT">OUTPUT</a>
    <a href="#EXAMPLES">EXAMPLES</a>
    <a href="#SEE-ALSO">SEE ALSO</a>
    <a href="#REFERENCES">REFERENCES</a>
    <a href="#AUTHORS">AUTHORS</a>
  </div>

  <ol class='man-decor man-head man head'>
    <li class='tl'>johnson_cycles(1)</li>
    <li class='tc'>www.complex-networks.net</li>
    <li class='tr'>johnson_cycles(1)</li>
  </ol>

  <h2 id="NAME">NAME</h2>
<p class="man-name">
  <code>johnson_cycles</code> - <span class="man-whatis">Enumerate the simple cycles of a graph</span>
</p>

<h2 id="SYNOPSIS">SYNOPSIS</h2>

<p><code>johnson_cycles</code> <var>graph_in</var> [<var>max_length</var> [SHOW]]</p>

<h2 id="DESCRIPTION">DESCRIPTION</h2>

<p><code>johnson_cycles</code> enumerates all the simple cycles of the graph given
on input, and prints the total number of cycles of each length. If
<var>max_length</var> is provided, <code>johnson_cycles</code> ignores any cycle whose
length is larger than <var>max_length</var>. If <code>SHOW</code> is given as third
argument, all the found cycles are printed on STDERR as soon as they
are found.</p>

<h2 id="PARAMETERS">PARAMETERS</h2>

<ul>
<li><p><var>graph_in</var>:
  input graph (edge list) if equal to <code>-</code> (dash), read the edge list
  from STDIN.</p></li>
<li><p><var>max_length</var>: The maximum length of cycles to count/print. If not
  provided, <code>johnson_cycles</code> tries to find all the cycles of the
  graph (see the <strong>WARNING</strong> in the section <a href="#OUTPUT" title="OUTPUT" data-bare-link="true">OUTPUT</a> below).</p></li>
<li><p>SHOW:
  If the third (optional) parameter is equal to <code>SHOW</code>, the program
  will dump on the standard error  all the cycles found.</p></li>
</ul>


<h2 id="OUTPUT">OUTPUT</h2>

<p><code>johnson_cycles</code> prints on the standard output the number of cycles of
each length, in the format:</p>

<pre><code>    2 N_2
    3 N_3
    4 N_4
    5 N_5
    ...
</code></pre>

<p>where 2, 3, 4, 5... is the cycle lengths and N_2, N_3, N_4, N_5... is
(twice) the number of cycles of that length.  If <code>SHOW</code> is given, each
cycle is also printed on STDERR as soon as it is found, in the format:</p>

<pre><code>node_l node_(l-1) node_(l-2) ... node_0
</code></pre>

<p>where <code>node_l</code>, <code>node_(l-1)</code>, etc. are the labels of the nodes
belonging to the cycle which starts at node  <code>node_0</code>.</p>

<p><strong>WARNING</strong>: If the second parameter <var>max_length</var> is not provided,
  <code>johnson_cycles</code> will try to enumerate <strong>all</strong> the cycles of the
  graph. In general, this might take a time <strong>exponential</strong> in the
  number of nodes and edges of the graph. As a consequence, specifying
  a maximum length is <strong>highly recommended</strong> if you are not interested
  in finding the number of cycles of any length.</p>

<h2 id="EXAMPLES">EXAMPLES</h2>

<p>We can count the cycle of any length in the graph of Florentine
families using the command:</p>

<pre><code>      $ johnson_cycles florentine.net
      2 20
      3 6
      4 4
      5 6
      6 10
      7 20
      8 22
      9 8
      10 2
      11 0
      12 0
      13 0
      14 0
      15 0
      16 0
      $
</code></pre>

<p>The output means that the graph has 20 cycles of length 2 (edges),
6/2=3 cycles of length 3, 4/2=2 cycles of length 4, and so on. We
could otherwise focus on the cycles of length up to 5 and have each
cycle printed on output:</p>

<pre><code>      $ johnson_cycles florentine.net 5 SHOW
      8 0 
      5 1 
      8 15 6 1 
      8 12 15 6 1 
      6 1 
      6 15 12 8 1 
      6 15 8 1 
      8 1 
      8 12 14 4 2 
      ....
      15 12 
      2 20
      3 6
      4 4
      5 6
      $ 
</code></pre>

<p>Apart from the degenerate cycles like "8 0", "5 1", etc.,
corresponding to the cycles obtained by traversing the same undirected
edge in the two possible directions, we see in that list some of the
cycles of length 4 (such as "8 15 6 1") and of length 5 (such as "8 12
15 6 1").</p>

<p>The enumeration of all the cycles is normally impractical on larger
graphs, so it is highly recommended to limit the search to short
sizes. For instance, the command:</p>

<pre><code>    $ johnson_cycles er_1000_5000.net 6
    2 5000
    3 340
    4 2406
    5 19416
    6 160554
    $ 
</code></pre>

<p>will require less than one second on a modern desktop computer, but
the command:</p>

<pre><code>    $ johnson_cycles er_1000_5000.net 7
    2 5000
    3 340
    4 2406
    5 19416
    6 160554
    7 1360104
    $
</code></pre>

<p>will probably take about 15 seconds, while:</p>

<pre><code>    $ johnson_cycles er_1000_5000.net 8
    2 5000
    3 340
    4 2406
    5 19416
    6 160554
    7 1360104
    8 11743500
    $
</code></pre>

<p>will run for more than 2 minutes, and larger cycle lengths will
require exponentially more time.</p>

<h2 id="SEE-ALSO">SEE ALSO</h2>

<p><a class="man-ref" href="f3m.1.html">f3m<span class="s">(1)</span></a>, <a class="man-ref" href="shortest.1.html">shortest<span class="s">(1)</span></a></p>

<h2 id="REFERENCES">REFERENCES</h2>

<ul>
<li><p>D. B. Johnson. "Finding All the Elementary Circuits of a Directed
Graph". SIAM J. Comput. 4 (1975), 77-84.</p></li>
<li><p>V. Latora, V. Nicosia, G. Russo, "Complex Networks: Principles,
Methods and Applications", Chapter 8, Cambridge University Press
(2017)</p></li>
<li><p>V. Latora, V. Nicosia, G. Russo, "Complex Networks: Principles,
Methods and Applications", Appendix 15, Cambridge University Press
(2017)</p></li>
</ul>


<h2 id="AUTHORS">AUTHORS</h2>

<p>(c) Vincenzo 'KatolaZ' Nicosia 2009-2017 <code>&lt;v.nicosia@qmul.ac.uk&gt;</code>.</p>


  <ol class='man-decor man-foot man foot'>
    <li class='tl'>www.complex-networks.net</li>
    <li class='tc'>September 2017</li>
    <li class='tr'>johnson_cycles(1)</li>
  </ol>

  </div>
</body>
</html>