This paper was converted on www.awesomepapers.org from LaTeX by an anonymous user.
Want to know more? Visit the Converter page.

Efficient Algorithm for Checking 2-Chordal (Doubly Chordal) Bipartite Graphs

Austin Alderete [email protected] University of Texas at Austin
Abstract

We present an algorithm for determining whether a bipartite graph GG is 2-chordal (formerly doubly chordal bipartite). At its core this algorithm is an extension of the existing efficient algorithm for determining whether a graph is chordal bipartite. We then introduce the notion of kk-chordal bipartite graphs and show by inductive means that a slight modification of our algorithm is sufficient to detect this property. We show that there are no nontrivial kk-chordal bipartite graphs for k4k\geq 4 and that both the 22-chordal bipartite and 33-chordal bipartite problem are contained within complexity class P\mathrm{P}.

keywords:
doubly chordal , 2-chordal
journal: arxiv

1 Introduction

The study of chordal graphs can be traced back to 1958 when they were first introduced by Hajnal and Surányi. These are the graphs for which every cycle of length four or greater contains a chord [1]. Since then several subclasses and variations of chordal graphs, notably bipartite analogs, have been introduced. Of interest to us is the notion of a 2-chordal bipartite (also known as a doubly chordal bipartite) graph which was recently connected to discrete statistical models and their maximum likelyhood degrees [2]. Efficient algorithm for recognizing chordal graphs and chordal bipartite graphs are known and are of polynomial complexity on the size of the vertex set[3] [4] [5]. 2-chordal bipartite graphs can be characterized as those bipartite graphs which are chordal bipartite and lack a double-square graphs as an induced subgraph, however the induced subgraph problem is known to be NP-complete in general [2] [6].

In this work, we present an efficient algorithm for checking whether a graph is 2-chordal bipartite and as a corollary show that the induced subgraph problem for the double-square graph is solvable in polynomial time. The algorithm breaks into two components- the first being the check that the graph is chordal bipartite and the second being an iterative process which runs over all edge deletions and is based on the vertex characterization due to Farber. We also show that the conditions checked are both necessary and sufficient conditions (although there may be a faster check for them) and then characterize the runtime of the algorithm. The key theorem underlying this algorithm is Theorem 3.1.

Theorem 3.1 (2-Chordal Bipartite Identification Theorem).

Given a bipartite graph G=(X,Y,E)G=(X,Y,E), it is 2-chordal bipartite if and only if both of the following are true:

  • (i)

    GG is chordal bipartite.

  • (ii)

    for each eEe\in E, the graph Ge=(X,Y,E{e})G_{e}=(X,Y,E-\{e\}) obtained from GG by deleting edge ee is chordal bipartite.

We also introduce and explore the natural generalization of Theorem 3.1 to kk-chordal bipartite graphs. This generalization allows us to propose algorithms which check the property of being kk-chordal bipartite and we show that they are also in complexity class PP for all kk. However, we provide a proof that there are no nontrivial kk-chordal bipartite graphs for k4k\geq 4 where nontrivial means that they contain a cycle of size at least 66 and in doing so remove the need for anything other than the k=2,3k=2,3 algorithms.

2 Background

In this section we lay out a few foundational results about chordal and strongly chordal graphs as well as their connection to chordal bipartite graphs. Formally, a chordal graph is a simple graph possessing no chordless cycles of length four or greater. Such a cycle is called a hole and so a chordal graph is a graph without holes [1]. A subclass of these graphs, introduced by Farber, is the strongly chordal graphs; these are chordal graphs for which every even cycle of length at least 6 has a strong chord, i.e. a chord joining vertices whose distance along the cycle is odd [3]. As we will see, strongly chordal graphs are closely related to another subclass found among bipartite graphs.

13542
13542
Figure 1: Non-chordal (left) versus chordal (right) graph

We will put a name to two special types of vertices: simplicial vertices and simple vertices. A simplicial vertex is a vertex whose open neighborhood forms a clique; that is, a vertex vv in the graph GG is simplicial if the subgraph induced on NG(v)N_{G}(v) is a complete graph. Meanwhile, a simple vertex is a vertex whose neighbors have closed neighborhoods which can be ordered as a chain under inclusion; that is, a vertex vv in the graph GG with open neighborhood NG(v)={v1,,vk}N_{G}(v)=\{v_{1},...,v_{k}\} is simple if there exists some relabeling σ\sigma on [k][k] such that

NG[vσ(1)]NG[vσ(2)]...NG[vσ(k)]N_{G}[v_{\sigma(1)}]\subseteq N_{G}[v_{\sigma(2)}]\subseteq...\subseteq N_{G}[v_{\sigma(k)}]

Observe that every simple vertex is also simplicial. The proof is as follows, suppose vv is a simple vertex and consider the induced subgraph on NG(v)N_{G}(v). It suffices to show that for any pair of edges u,wNG(v)u,w\in N_{G}(v) there is an edge between them. As the set of closed neighbhorhoods of neighbors of vv form a chain, we have either uNG[u]NG[w]u\in N_{G}[u]\subseteq N_{G}[w] or wNG[w]NG[u]w\in N_{G}[w]\subseteq N_{G}[u]. In either case, uwE(G)uw\in E(G) as desired.

13425
Figure 2: Graph with simple and simplicial vertex 4
13425

\subseteq      13425      \subseteq      13425

Figure 3: NG[1]NG[2]NG[3]N_{G}[1]\subseteq N_{G}[2]\subseteq N_{G}[3] for neighbors of vertex 4 of Figure 2
1342567
Figure 4: Graph whose vertex 4 is simplicial but not simple

These distinguished vertex classes play an important role in the theory of chordal graphs. A graph is chordal if and only if every induced subgraph contains a simplicial vertex and a graph is strongly chordal if and only if every induced subgraph has a simple vertex [3] [4]. These properties lend themselves to finding chordal and strongly chordal graphs by means of algorithms which perform a simplicial elimination ordering or a simple elimination ordering respectively; that is, an algorithm to determine whether a graph is chordal (strongly chordal) is to search the graph for a simplicial (simple) vertex, form the subgraph induced by removing it, and repeat. Such an algorithm effectively checks either that there are sufficiently many simplicial vertices- i.e. every induced subgraph contains at least one of them- or it identifies a particular induced subgraph which does not contain a simplicial vertex. Note that the algorithm does not run over all induced subgraphs nor is it a requirement to do so.

These algorithms provide polynomial-time methods of determining characteristics of graphs. For strong chordal graphs, the simple elimination ordering is equivalent to the strong elimination ordering which is an ordering v1,,vnv_{1},...,v_{n} of the vertices such that if (i) i<ji<j and k<lk<l, (ii) vk,vlN[vi]v_{k},v_{l}\in N[v_{i}], (iii) vjN[vk]v_{j}\in N[v_{k}], then vlN[vj]v_{l}\in N[v_{j}] [5]. There are numerous other characterizations of strongly chordal graphs which include sun-characterizations, hereditary dually chordal characterizations, hypertree characterizations, and (n+4)(n+4)-vertex cycle subgraph characterizations [7]. One characterization that we will briefly touch on is the hypergraph characterization. A graph is chordal if and only if the hypergraph of its maximal cliques is the dual of a hypertree. This leads us to the definition of a dually chordal graph, which is a graph whose hypergraph of maximal cliques is itself a hyperrtree. A graph is called doubly chordal if it is both chordal and dually chordal. This naming convention will influence our choice of nomenclature when it comes to bipartite graphs.

We now turn our attention to bipartite graphs proper and their subclasses. A bipartite graph is chordal bipartite if every cycle of length greater than or equal to 6 has a chord. A bipartite graph is 2-chordal bipartite if every cycle of length greater than or equal to 6 has at least two chords. This property has also been called “doubly chordal bipartite” in the literature, but due to the classical definition of doubly chordal mentioned above we have adopted “2-chordal bipartite” in its place [2]. If G=(X,Y,E)G=(X,Y,E) is a bipartite graph and GG^{\prime} is the graph obtained from GG by adding an edge in-between every pair of vertices in XX, then GG is chordal bipartite if GG^{\prime} is strongly chordal [7]. This provides a link between our concepts. An important observation is that a chordal bipartite graph need not be chordal. For example, consider the graph C4C_{4} with V(C4):={a,b,c,d}V(C_{4}):=\{a,b,c,d\} and E(C4):={{a,b},{c,d},{ac,ad,bc,bd}}E(C_{4}):=\{\{a,b\},\{c,d\},\{ac,ad,bc,bd\}\}. Clearly this graph is vacuously chordal bipartite as it contains no cycles of length 6. However, it contains the cycle acbd=ac+cb+bd+acacbd=ac+cb+bd+ac, of length 4, and this cycle contains no chords (in fact, it uses every edge of C4C_{4} as highlighted by the addition).

3 Algorithm for determining whether a graph is 2-chordal bipartite

We begin with our main algorithm which takes a bipartite graph as input and answers the yes/no question of whether or not the graph is 2-chordal bipartite. We define two classes beforehand. The first is the class graph which is initialized with a triple containing its name, vertex set, and edge set given as pairs of vertices. For its methods it has the usual graph operations as well as a method called simple which takes as input a vertex and outputs a boolean value representing whether or not the vertex is simple. The second class is biGraph which is initialized with a 4-tuple containing its name, two disjoint vertex sets, and its edge set given as pairs selected from both sets. Its methods are the usual operations on bipartite graphs as well as a forgetful operation which constructs its underlying graph. With this in mind we are ready to present the algorithm.

Algorithm 1 2-chordal Bipartite Checker
1:Input: G:=(X,Y,E)G:=(X,Y,E) a bipartite graph with vertex sets X,YX,Y and edge set EE
2:Output: True if GG is 2-chordal bipartite, false otherwise
3:  H:=graph(XY,E)H:=\mathrm{graph}(X\cup Y,E)
4:  yetToGlue := XX
5:  for xx in XX:
6:      yetToGlue := yetToGlue{x}-\{x\}
7:    for vv in yetToGlue:
8:      add {x,v}\{x,v\} to HH.edges
9:  flag := 0
10:  while HH.vertices \neq\emptyset and flag ==0==0:
11:    for vertex in HH.vertices:
12:      if HH.simple(vertex) == True:
13:        HH := HH.delete(vertex)
14:        if HH.vertex == \emptyset:
15:          flag :=1
16:        restart while loop
17:    flag := 2
18:  if flag == 2:
19:    return false
20:  for edge in EE:
21:    HeH_{e} := graph(XYX\cup Y,E{e}E-\{e\})
22:    yetToGlue := XX
23:    for xx in XX:
24:      yetToGlue := yetToGlue - {x}\{x\}
25:      for vv in yetToGlue:
26:        add {x,v}\{x,v\} to HeH_{e}.edges
27:    flag := 0
28:    while HeH_{e}.vertices \neq\emptyset and flag == 0:
29:      for vertex in HeH_{e}.vertices:
30:        if HeH_{e}.simple(vertex) == True:
31:          He:=HeH_{e}:=H_{e}.delete(vertex)
32:          if HeH_{e}.vertex == \emptyset:
33:            flag :=1
34:          restart while loop
35:      flag :=2
36:  if flag == 2:
37:    return false
38:  return True

A fast implementation of the simple method for vertices can be done in any software which can check whether a collection of sets is nested. Having introduced the algorithm we will now show that it successfully detects whether or not the graph is 2-chordal bipartite. We claim that the graph successfully checks (i) and (ii) of Theorem 3.1.

Theorem 3.1 (2-Chordal Bipartite Identification Theorem).

Given a bipartite graph G=(X,Y,E)G=(X,Y,E), it is 2-chordal bipartite if and only if both of the following are true:

  • (i)

    GG is chordal bipartite.

  • (ii)

    for each eEe\in E, the graph Ge=(X,Y,E{e})G_{e}=(X,Y,E-\{e\}) is chordal bipartite.

We first look at the intuition behind this theorem. Property (ii) is not sufficient alone as we could have a graph which was entirely a cycle of size 6. In this hypothetical graph GG, the modified graph GeG_{e} would satisfy (ii) for any eE(G)e\in E(G) as it contains no cycles. However, the original graph GG clearly fails to be chordal bipartite let alone 2-chordal bipartite. With the addition of (i), we guarantee that any cycle of size 6 or more contains at least one chord. As we iterate over the edges of the graph in (ii), we encounter this chord and our modified graph contains the same cycle, but with one fewer chords. Therefore if the modified graph is chordal bipartite, it must contain a second chord.

Proof.

Let G=(X,Y,E)G=(X,Y,E) be a graph. Suppose that (i) and (ii) hold for GG. We now wish to show that GG is 2-chordal bipartite. Suppose that GG contains a cycle CC of length greater than or equal to 66. As (i) is true, it must have at least one chord, which we will denote cc. Now consider GeG_{e}. Clearly CE(Ge)C\subseteq E(G_{e}) and so GeG_{e} also contains a cycle of size 6 or greater. Moreover, by (ii) we have that this cycle contains a chord in GeG_{e}. As ee is not an edge in GeG_{e}, this chord must be a second chord of the cycle CC when viewed in GG itself and so we are done.

Conversely, if a graph GG is 2-chordal bipartite, then it automatically must satisfy (i). Supposing that (ii) is false for GG implies that there exists some edge ee for which GeG_{e} fails to be chordal bipartite. In which case GeG_{e} contains a cycle of length greater than or equal to 6, call it CE(Ge)C\subseteq E(G_{e}), which contains no chords. Consider the embedded image of CC in GG. As a cycle in GG it contains at most one more chord than it did in GeG_{e} (namely ee), hence it contains at most a single chord, contradicting the assumption that GG is 2-chordal bipartite. ∎

Theorem 3.2.

The 2-chordal Bipartite Checker Algorithm (Algorithm 1) returns True if and only if its input is a 2-chordal bipartite graph.

Proof.

We first show that that Algorithm 1 halts on any bipartite graph GG input. This amounts to showing that each while loop ends. We look first at the while loop on line 10. If the for loop on line 11 iterates through every vertex of HH (which is a finite set) then the variable flag is set to 2 and the while loop terminates followed by the algorithm returning false. If the for loop on line 11 fails to iterate through every vertex of HH, then line 16 must have been carried out. This requires that there is a vertex which satisfies the condition on line 12 (i.e. it’s simple) and so line 13 runs. This reduces the cardinality of the vertex set of HH and then resets the while loop. Therefore the while loop on line 10 must eventually break as there are only finitely many vertices to remove. There is only one other loop which could potentially prevent the algorithm from halting and it occur on line 23. However, this loop is a copy of the loop on line 10 and so it also ends.

Suppose that Algorithm 1 is run with input a 2-chordal bipartite graph G=(X,Y,E)G=(X,Y,E). Note that if the algorithm terminates and the variable “flag” is never set equal to 2, then it returns True. Thus it is only necessary to show that flag is never set equal to 2. On line 17 we have that flag is set equal to 2. For this line of the algorithm to be run requires that the for loop on line 11 complete without resetting the while loop on line 10, i.e. the conditions of line 12 must never be satisfied for any vertex in HH. That is, HH contains no simple vertices. However, if HH contains no simple vertices then HH is not strongly chordal. In the algorithm, HH is the graph obtained from GG by adding edges between every pair of vertices in XX. Therefore, if HH fails to be strongly chordal, GG fails to be chordal bipartite. By Theorem 3.1, this implies that GG is not 2-chordal bipartite. This contradicts our assumption and so flag must not be set equal to 2 on line 17. The only other place flag can be set equal to 2 is on line 30. This requires that there exist an edge ee of our graph GG for which the graph obtained from GG by deleting GG fails to be chordal bipartite (the algorithm performs the same strongly chordal check). But this would imply that GG fails to satisfy condition (ii) of Theorem 3.1 and so cannot happen. Therefore, if Algorithm 1 is run with input a 2-chordal bipartite graph, then it outputs True.

Conversely if the Algorithm outputs True, then by running the above argument in reverse we find that conditions (i) and (ii) of the theorem are satisfied and so its input must have been a 2-chordal bipartite graph. ∎

4 k-chordal bipartite graphs

Theorem 3.1 has a natural generalization to kk-chordal bipartite graphs.

Theorem 4.3.

Given a bipartite graph G=(X,Y,E)G=(X,Y,E), it is kk-chordal bipartite if and only if both of the following are true:

  • (i)

    GG is chordal bipartite

  • (ii)

    for each eEe\in E, the graph Ge=(X,Y,E{e})G_{e}=(X,Y,E-\{e\}) is (n1)(n-1)-chordal bipartite.

We allow 0-chordal bipartite to be a vacuous truth of all graphs so that Theorem 4.3. is valid for all kk\in{\mathbb{N}}. We call an kk-chordal bipartite graph trivial if it contains no cycles of length 6 or greater. The proof of this theorem mirrors the 2-chordal bipartite case.

Proof.

We prove this by induction. We’ve already shown the base case, so let k>2k>2 and suppose that the theorem holds for all natural numbers less than kk. Let GG be a bipartite graph and suppose that (i) and (ii) hold for the kk-chordal bipartite version of the theorem, i.e. GG is chordal bipartite and for each eEe\in E the graph GeG_{e} is (k1)(k-1)-chordal bipartite.

If GG has a cycle of size 66, then by (i) it contains a chord, call it ee. By (ii), GeG_{e} contains (k1)(k-1) chords and so the cycle in GG must contain all of those chords plus ee, i.e. at least kk chords. Therefore GG is kk-chordal bipartite.

Conversely, if GG is kk-chordal bipartite then it is chordal bipartite. Supposing that (ii) is false for GG implies that there exists an edge ee for which GeG_{e} fails to be (k1)(k-1)-chordal bipartite. That is, there is a cycle CE(Ge)C\subseteq E(G_{e}) which contains at most k2k-2 chords. Considering the image of CC in GG we find that it contains at most k1k-1 chords, a contradiction. ∎

There is an important bound on the minimum cycle size for nontrivial kk-chordal bipartite graphs for large nn.

Lemma 4.4.

There does not exist a nontrivial nn-chordal bipartite graph containing a cycle of size exactly 66 for n4n\geq 4.

This can easily be seen by noting that a cycle of size 6 is constructed from two sets of three vertices and can at most admit three chords, as shown in Figure 5.

Figure 5: Cycle of size 6 in a bipartite graph admits at most 3 chords
Theorem 4.5.

For k4k\geq 4, there are no nontrivial kk-chordal bipartite graphs.

Proof.

Suppose that GG is a nontrivial nn-chordal bipartite graph for fixed n4n\geq 4. Then it contains some cycle CE(G)C\subseteq E(G) of length greater than or equal to 66. If the length equals 66 then we’ve arrived at a contradiction by Lemma 2.3. If the length is greater than 66 then we can choose any one of the chords which subdivide the cycle and obtain two new cycles. If one of these cycles has a length greater than or equal to 6 (but is also necessarily of length less than the length of cycle CC), then we restart the process replacing CC with this new smaller cycle.

If neither of the two cycles (which we will denote C1,C2C_{1},C_{2}) produced by the chord bisecting CC have length greater than or equal to 66, then we consider the following: (1) CC is a cycle of even length, (2) the length of CC is greater than 66 by the above, and (3) |C|=|C1|+|C2|2|C|=|C_{1}|+|C_{2}|-2. Therefore,

8|C|=|C1|+|C2|28\leq|C|=|C_{1}|+|C_{2}|-2

which implies that 10|C1|+|C2|10\leq|C_{1}|+|C_{2}|. The only way to partition 1010 into two natural numbers |C1|,|C2||C_{1}|,|C_{2}| such that neither number is greater than or equal to 66 is for |C1|=|C2|=5|C_{1}|=|C_{2}|=5. Thus, |C|=8|C|=8. We can draw the corresponding cycle and chord as in Figure 6.

Figure 6: Cycle CC of size 8 with chord inducing two cycles of size 5

However, Figure 6 cannot arise in a bipartite graph as there is no two-coloring of the vertices in the figure when the chord is present. Therefore, one of the two cycles formed by the chord dividing CC must have length greater than or equal to 6 yet less than the length of CC itself and so we’re returned to the case above.

As this process always decreases the length of the cycle CC and has lower bound equal to 66, then a finite iteration of this process must achieve said bound, leading to the contradiction by Lemma 2.3. ∎

5 Efficiency of the algorithm

Our attention now turns to the efficiency of the problem. Algorithm 1 is a naive implementation in that faster means of checking whether a graph is strongly chordal are known, in fact it can checked via the construction of a strong perfect elimination ordering. This construction is related to the problem of doubly lexical orderings of matrices and can be performed in time O(min(s2,(s+t)logs))O(\min(s^{2},(s+t)\log s)) where ss is the cardinality of the vertex set and tt is the cardinality of the edge set [8] [9]. This allows us to check that a bipartite graph is chordal bipartite in O(min(s2,(2s+t)log(s))=O(min(s2,(s+t)logs)O(\min(s^{2},(2s+t)\log(s))=O(\min(s^{2},(s+t)\log s) time (as a graph is chordal bipartite if and only if the graph obtained by adding an edge between every pair of vertices in one of its partitions is strongly chordal). Thus, the decision problem is in complexity class P. The algorithm for determining whether a bipartite graph is 2-chordal bipartite amounts to iterating the chordal bipartite algorithm over the edge set of the bipartite graph. Within the loop the subgraph has one fewer edge but the same number of vertices.

Theorem 5.6 (2-chordal Bipartite Efifciency).

Given a bipartite graph GG, it can be checked whether or not it is 2-chordal bipartite in polynomial time on the vertex set alone.

Proof.

Let GG be our graph with ss vertices and tt edges. Let Ds,tD_{s,t} be the time it takes to produce an induced subgraph from GG (can be taken to be s+t1s+t-1 assuming operations are done on vertices and edges) and let Ts,tT_{s,t} be the time it takes to check whether GG is chordal bipartite. To check that GG is 2-chordal bipartite, we first check that GG is itself chordal bipartite and then check that all of its subgraphs created by deleting an edge are chordal bipartite. Then determining whether GG is 2-chordal bipartite can be done in

Ts,t+t(Ds,t+Ts,t1)=O(max{Ts,t,tDs,t,tTs,t1})T_{s,t}+t(D_{s,t}+T_{s,t-1})=O(\max\left\{T_{s,t},tD_{s,t},tT_{s,t-1}\right\})
=O(max{min(s2,(s+t)logs),tDs,t,min(ts2,(t(s+t1))logs)})=O(\max\left\{\min(s^{2},(s+t)\log s),tD_{s,t},\min(ts^{2},(t(s+t-1))\log s)\right\})

Therefore the 2-chordal bipartite problem is polynomial on the vertex and edge set. To show that it is polynomial on the vertex set, we note that for bipartite graphs tt is bounded by s24\frac{s^{2}}{4}. This is because the complete bipartite graph Ks1,s2K_{s_{1},s_{2}} contains s1s2s_{1}s_{2} edges and for a fixed number of total vertices, i.e. s=s1+s2s=s_{1}+s_{2}, the maximum is obtained when s1=s2s_{1}=s_{2} (or s1=s2+1s_{1}=s_{2}+1 if ss is odd). These maxima are s24\frac{s^{2}}{4} and s214\frac{s^{2}-1}{4} respectively. So by replacing every tt above with s2/4s^{2}/4 we obtain a polynomial bound on the runtime in terms of the cardinality of the vertex set alone. ∎

Going a bit further, it’s reasonable to assume that Ds,tD_{s,t} is negligible compared to the other operations and that t>1t>1, in which case the above is O(min{ts2,t(s+t1)logs)O(\min\{ts^{2},t(s+t-1)\log s). In other words, the process is as efficient as possible with the current characterization of 2-chordal bipartite graphs offered here. Like the 22-chordal bipartite problem, the 33-chordal bipartite problem, and the general kk-chordal bipartite problem, is polynomial in complexity on the vertex set alone and its runtime can be found by iterating this process giving

O(Ts,tk+1i=0k2(ti))O\left(T_{s,t-k+1}\prod_{i=0}^{k-2}(t-i)\right)

under the mild assumptions given above. A small corollary of Theorem 5.1 is that the induced subgraph problem for the double square graph is also in P.

References

  • [1] A. Hajnal, J. Surányi, Über die auflösung von graphen in vollständige teilgraphen, Annales Univ. Sci. Budapest. Eötvös. Sect. Math. 1 (1958) 113–121.
  • [2] J. Coons, S. Sullivant, Quasi-independence models with rational maximum likelihood estimator, Journal of Symbolic Computation 104 (2021) 917–941.
  • [3] M. Farber, Characterizations of strongly chordal graphs, Discrete Mathematics 2 (1983) 173–189.
  • [4] G. A. Dirac, On rigid circuit graphs, Abhandlungen aus dem Mathematischen Seminar der Universität Hamburg 25 (1961) 71–76.
  • [5] M. Pelsmajer, J. Tokaz, D. West, New proofs for strongly chordal graphs and chordal bipartite graphs, preprint (2004).
  • [6] D. Johnson, The np-completeness column: an ongoing guide, Journal of Algorithms 6 (1985) 434–454.
  • [7] H. de Ridder et al., Information System on Graph Classes and their Inclusions (ISGCI), https://www.graphclasses.org (2018).
  • [8] A. Lubiw, Doubly lexical orderings of matrices, SIAM Journal on Computing 16 (1987) 854–879.
  • [9] R. Paige, R. Tarjan, Three partition refinement algorithms, SIAM Journal on Computing 16 (1987) 973–989.