Grundlagen

Cliquen, unabhängige Mengen und Knotenüberdeckungen

Eine Clique ist eine Menge von Knoten, die alle miteinander verbunden sind, eine unabhängige Menge eine, in der keiner mit einem anderen verbunden ist, und eine Knotenüberdeckung eine Menge, die jede Kante berührt. Dieser Leitfaden zeigt, warum die drei Fragen eigentlich eine einzige sind, warum maximal nicht maximum ist, wie man die Antworten exakt und näherungsweise findet, warum sie im Allgemeinen so schwer sind und was die Ramsey-Theorie über sie sagt, durchgehend mit getestetem Python-Code.

23 Min Lesezeit Aktualisiert: Oktober 2026 Anfänger
Mohammed Islam Hadjoudj
Mohammed Islam Hadjoudj
Expert Operations Research Engineer

1. Cliquen, unabhängige Mengen und Knotenüberdeckungen

Drei der am meisten untersuchten Fragen der Graphentheorie betreffen Mengen von Knoten, und jede lässt sich in einer Zeile formulieren.

Eine Clique und eine unabhängige Menge sind Gegensätze: Die eine verlangt alle möglichen Kanten zwischen den gewählten Knoten, die andere keine. In einem Freundschaftsnetz ist eine Clique eine Gruppe, in der jeder jeden kennt, und eine unabhängige Menge eine Gruppe von einander Fremden. Das Wort „Clique“ kam aus der Soziologie in das Fachgebiet, wo Luce und Perry es 1949 für genau solche Gruppen verwendeten. Der Leitfaden zu Knoten und Kanten behandelt das Vokabular, auf dem diese Definitionen beruhen.

Jede Frage birgt eine Falle in der Formulierung. Als maximal gilt eine Menge, wenn sich nichts zu ihr hinzufügen (bei einer Überdeckung: nichts aus ihr entfernen) lässt, ohne die Eigenschaft zu verletzen. Als maximum gilt sie, wenn es keine größere Menge mit der Eigenschaft gibt, bei einer Überdeckung keine kleinere. Jede Menge, die maximum ist, ist auch maximal, aber nicht umgekehrt, und am Unterschied zwischen beiden scheitern die meisten Algorithmen.

2. Ein Graph, drei Antworten, eine Identität

Das durchgehende Beispiel hat 8 Knoten und 12 Kanten. Die Knoten A, B, C und D sind alle miteinander verbunden, D, E und F bilden ein Dreieck, und ein 5-Kreis C, D, F, G, H verläuft unten herum:

E = {AB, AC, AD, BC, BD, CD, CH, DE, DF, EF, FG, GH}      8 Knoten, 12 Kanten

deg:   A 3   B 3   C 4   D 5   E 2   F 3   G 2   H 2
Derselbe Graph mit acht Knoten dreimal. Links: die Clique A, B, C, D blau hervorgehoben mit ihren sechs Kanten, beschriftet mit Omega gleich 4. Mitte: die unabhängige Menge A, E, G in Grün, beschriftet mit Alpha gleich 3. Rechts: die Knotenüberdeckung B, C, D, F, H in Orange, beschriftet mit Tau gleich 5.
Die größte Clique, die größte unabhängige Menge und die kleinste Knotenüberdeckung des durchgehenden Beispiels. Die Überdeckung besteht genau aus den Knoten, die die unabhängige Menge auslässt.

Die größte Clique ist {A, B, C, D}, also ω = 4, und sie ist die einzige Clique dieser Größe. Die größten unabhängigen Mengen haben 3 Knoten, zum Beispiel {A, E, G}, also α = 3; es gibt sieben davon. Die kleinsten Knotenüberdeckungen haben 5 Knoten, zum Beispiel {B, C, D, F, H}, also τ = 5, und wieder gibt es sieben. Die beiden Siebenen sind kein Zufall.

Zwei kurze Argumente verbinden die drei Zahlen. Erstens hat das Komplement eines Graphen genau dort eine Kante, wo der Graph keine hat, daher ist eine Clique in G eine unabhängige Menge im Komplement und umgekehrt: ω(G) ist gleich α des Komplements. Zweitens ist eine Menge S genau dann unabhängig, wenn die übrigen Knoten eine Knotenüberdeckung bilden. Würde eine Kante die übrigen Knoten verfehlen, lägen beide ihrer Endknoten in S, also wäre S nicht unabhängig, und das Argument funktioniert genauso in umgekehrter Richtung. Das größte S liefert die kleinste Überdeckung:

α(G) + τ(G) = n, für jeden Graphen mit n Knoten.

Diese Identität wird meist Gallai zugeschrieben, der sie 1959 veröffentlichte. Im Beispiel gilt 3 + 5 = 8, und die sieben größten unabhängigen Mengen sind genau die Komplemente der sieben kleinsten Überdeckungen. Die praktische Folge: Die drei Probleme sind ein einziges Problem in drei Verkleidungen. Ein Algorithmus für eines von ihnen, auf den Graphen oder auf sein Komplement angewandt, löst die beiden anderen exakt.

3. Maximal ist nicht maximum

Das Dreieck {D, E, F} ist eine Clique, und kein Knoten lässt sich hinzufügen, weil kein anderer Knoten zu allen dreien von D, E und F benachbart ist. Es ist eine maximale Clique der Größe 3, während das Maximum 4 ist. Die Kanten CH, FG und GH sind ebenfalls maximale Cliquen, der Größe 2: Keine von ihnen liegt in einem Dreieck. Insgesamt hat das Beispiel fünf maximale Cliquen, und nur eine von ihnen ist eine größte Clique.

Zwei Ansichten des Beispielgraphen. Links: das Dreieck D, E, F violett hervorgehoben, eine maximale Clique, die nicht wachsen kann, aber nur 3 Knoten hat gegenüber den 4 von A, B, C, D. Rechts: die gierige unabhängige Menge D, G in Grün; jeder andere Knoten ist zu D oder G benachbart, doch die größte unabhängige Menge hat 3 Knoten.
Zwei Sackgassen. Jede Menge ist maximal, da sich nichts hinzufügen lässt, und jede ist kleiner als die bestmögliche.

Unabhängige Mengen tappen noch leichter in dieselbe Falle. Das naheliegende gierige Verfahren geht die Knoten durch und nimmt jeden, dessen Nachbarn noch nicht genommen wurden. Das Ergebnis ist immer maximal, aber seine Größe hängt von der Reihenfolge ab. Beginnt man mit D, dem Knoten mit dem höchsten Grad, dann blockiert D fünf Knoten auf einmal; nachdem G genommen ist, ist jeder verbleibende Knoten zu einem der beiden benachbart, und das Verfahren endet bei {D, G}, einen Knoten unter dem Optimum. Das Beispiel hat zehn maximale unabhängige Mengen, drei der Größe 2 und sieben der Größe 3. Mit Knoten niedrigen Grades zu beginnen, die wenige andere blockieren, ist eine bessere Gewohnheit, aber keine gierige Reihenfolge ist für jeden Graphen richtig.

Die Lehre überträgt sich auf Software. Eine Routine, die „eine Clique findet“ oder „eine unabhängige Menge findet“, liefert meist schnell eine maximale. Eine größte zu finden ist eine andere und viel schwerere Aufgabe, und im Rest dieses Artikels geht es darum, sie zu finden, sie zu approximieren und sie abzuschätzen.

4. Alle maximalen Cliquen auflisten: Bron–Kerbosch

Der klassische Weg, alle maximalen Cliquen zu finden, ist der Algorithmus, den Bron und Kerbosch 1973 veröffentlichten. Er lässt eine Clique R Knoten für Knoten wachsen und führt zwei weitere Mengen: P, die Knoten, die noch hinzugefügt werden könnten, weil sie zu allem in R benachbart sind, und X, die Knoten, die hinzugefügt werden könnten, aber bereits untersucht wurden, sodass jede Clique, die sie verwendet, schon gemeldet wurde. Wenn P und X beide leer sind, kann R nicht wachsen und nichts wurde übersprungen, also ist R eine maximale Clique.

def graph(edges):
    adj = {}
    for u, v in edges:
        adj.setdefault(u, set()).add(v)
        adj.setdefault(v, set()).add(u)
    return adj

def bron_kerbosch(R, P, X, adj, out):
    """Meldet jede maximale Clique, die R enthält, nur P verwendet und X meidet."""
    if not P and not X:
        out.append(sorted(R))                 # nichts kann hinzugefügt werden: R ist maximal
        return
    pivot = max(P | X, key=lambda u: len(P & adj[u]))
    for v in sorted(P - adj[pivot]):          # Nachbarn des Pivots werden später versucht
        bron_kerbosch(R | {v}, P & adj[v], X & adj[v], adj, out)
        P.remove(v)
        X.add(v)                              # jede Clique mit v wurde nun gemeldet

def maximal_cliques(adj):
    out = []
    bron_kerbosch(set(), set(adj), set(), adj, out)
    return sorted(out, key=lambda c: (-len(c), c))

def complement(adj):
    return {v: set(adj) - adj[v] - {v} for v in adj}

G = graph(['AB', 'AC', 'AD', 'BC', 'BD', 'CD', 'CH', 'DE', 'DF', 'EF', 'FG', 'GH'])

print(maximal_cliques(G))
# [['A', 'B', 'C', 'D'], ['D', 'E', 'F'], ['C', 'H'], ['F', 'G'], ['G', 'H']]
print(maximal_cliques(complement(G)))   # die maximalen unabhängigen Mengen von G
# [['A', 'E', 'G'], ['A', 'E', 'H'], ['A', 'F', 'H'], ['B', 'E', 'G'], ['B', 'E', 'H'], ['B', 'F', 'H'], ['C', 'E', 'G'], ['C', 'F'], ['D', 'G'], ['D', 'H']]

Der Pivot macht ihn schnell. Jede maximale Clique muss den Pivot oder einen nicht zu ihm benachbarten Knoten enthalten, daher muss die Schleife nur über die Nicht-Nachbarn des Pivots verzweigen; die Wahl desjenigen Knotens aus P oder X mit den meisten Nachbarn in P als Pivot spart die meiste Arbeit. Tomita, Tanaka und Takahashi bewiesen 2006, dass die Laufzeit mit dieser Regel O(3n/3) beträgt, und diese Schranke lässt sich nicht verbessern, denn Moon und Moser zeigten 1965, dass ein Graph auf n Knoten 3n/3 maximale Cliquen haben kann, wenn n ein Vielfaches von 3 ist. Der extreme Graph ist das Komplement von n/3 disjunkten Dreiecken: Auf 9 Knoten hat er 27 maximale Cliquen, auf 30 Knoten 59.049.

Die erste Ausgabezeile listet die fünf maximalen Cliquen aus Abschnitt 3 auf, die größte zuerst. Die zweite Zeile wendet dieselbe Funktion auf das Komplement an und listet so die zehn maximalen unabhängigen Mengen auf. Die Funktion wurde an 3.000 Zufallsgraphen mit bis zu 10 Knoten gegen die Cliquensuche von networkx geprüft, die denselben Algorithmus verwendet.

5. Die größte unabhängige Menge exakt finden

Alle maximalen Mengen aufzulisten ist oft mehr als nötig, und die Antwort lässt sich stattdessen mit einer direkten Suche finden. Zwei Regeln genügen für ein korrektes Verfahren. Ein Knoten vom Grad 0 kann immer genommen werden. Ein Knoten v vom Grad 1 kann ebenfalls immer genommen werden: Enthält eine größte unabhängige Menge seinen einzigen Nachbarn u, so bleibt sie beim Austausch von u gegen v unabhängig und gleich groß. Wenn keine der beiden Regeln greift, wählt man einen Knoten und probiert beide Möglichkeiten aus: ihn nehmen und seine Nachbarn löschen, oder ihn weglassen.

def graph(edges):
    adj = {}
    for u, v in edges:
        adj.setdefault(u, set()).add(v)
        adj.setdefault(v, set()).add(u)
    return adj

def remove(adj, gone):
    return {u: adj[u] - gone for u in adj if u not in gone}

def greedy_independent_set(adj, order):
    """Nimmt jeden Knoten der Reihe nach, außer ein Nachbar ist schon genommen. Immer maximal."""
    chosen = set()
    for v in order:
        if not adj[v] & chosen:
            chosen.add(v)
    return chosen

def max_independent_set(adj):
    """Exakt: Ein Knoten vom Grad 0 oder 1 kann immer gefahrlos genommen werden; sonst verzweigen."""
    if not adj:
        return set()
    v = min(adj, key=lambda u: len(adj[u]))
    if len(adj[v]) <= 1:
        return {v} | max_independent_set(remove(adj, {v} | adj[v]))
    v = max(adj, key=lambda u: len(adj[u]))
    take = {v} | max_independent_set(remove(adj, {v} | adj[v]))   # v rein, Nachbarn raus
    skip = max_independent_set(remove(adj, {v}))                  # v raus
    return take if len(take) >= len(skip) else skip

G = graph(['AB', 'AC', 'AD', 'BC', 'BD', 'CD', 'CH', 'DE', 'DF', 'EF', 'FG', 'GH'])

print(sorted(greedy_independent_set(G, 'DGABCEFH')))   # mit dem meistverbundenen Knoten beginnen
# ['D', 'G']
best = max_independent_set(G)
print(sorted(best), sorted(set(G) - best))             # größte unabhängige Menge, kleinste Überdeckung
# ['A', 'E', 'G'] ['B', 'C', 'D', 'F', 'H']

Die erste Zeile wiederholt die gierige Sackgasse aus Abschnitt 3. Die zweite Zeile liefert eine größte unabhängige Menge, {A, E, G}, und nach der Identität aus Abschnitt 2 bilden die Knoten, die sie auslässt, eine kleinste Knotenüberdeckung, {B, C, D, F, H}. Die Funktion wurde an denselben 3.000 Zufallsgraphen gegen networkx geprüft, und jede zurückgegebene Menge war unabhängig und hatte die richtige Größe.

Das Verzweigen an einem Knoten größten Grades ist Absicht: Ihn zu nehmen löscht die meisten Knoten, sodass dieser Zweig den Graphen am schnellsten verkleinert. Die Gradregeln bedeuten außerdem, dass die Suche auf einem Wald überhaupt nie verzweigt, da jeder Wald einen Knoten vom Grad 0 oder 1 hat und das Löschen von Knoten ihn zu einem Wald lässt. Auf allgemeinen Graphen ist die Suche weiterhin exponentiell, aber weit kleiner als die 2n Teilmengen: Tarjan und Trojanowski verfeinerten 1977 Regeln dieser Art zu einem Algorithmus, der in O(2n/3) läuft, und spätere Arbeiten haben die Basis weiter gesenkt.

6. Knotenüberdeckung: eine 2-Approximation und ein schneller exakter Test

Die Knotenüberdeckung hat zwei Eigenschaften, die ihren Partnern fehlen, und beide ergeben sich aus dem Blick auf die Kanten. Die erste ist eine einfache Approximation. Man geht die Kanten durch, und immer wenn eine Kante noch keinen Endknoten in der Überdeckung hat, fügt man beide Endknoten hinzu. Die so gewählten Kanten haben keinen gemeinsamen Knoten, bilden also ein Matching, und keine weitere Kante könnte hinzukommen, also ist es ein maximales Matching. Jede Überdeckung überhaupt muss mindestens einen Endknoten jeder Matchingkante enthalten, und diese Endknoten sind alle verschieden, also ist τ mindestens so groß wie die Zahl der Matchingkanten. Das Verfahren nimmt genau zwei Knoten pro Matchingkante, also ist seine Überdeckung nie mehr als doppelt so groß wie das Optimum. Dieses Argument wird meist Gavril und Yannakakis zugeschrieben, und das Buch von Garey und Johnson aus dem Jahr 1979 machte es weithin bekannt.

def matching_cover(edges):
    """2-Approximation: beide Endknoten jeder noch nicht überdeckten Kante nehmen."""
    cover = set()
    for u, v in edges:
        if u not in cover and v not in cover:
            cover |= {u, v}                   # diese Kanten bilden ein maximales Matching
    return cover

def cover_of_size(edges, k):
    """Eine Knotenüberdeckung mit höchstens k Knoten oder None. Höchstens 2^k Zweige."""
    if not edges:
        return set()
    if k == 0:
        return None
    u, v = edges[0]                           # u oder v muss in jeder Überdeckung liegen
    for w in (u, v):
        rest = [e for e in edges if w not in e]
        found = cover_of_size(rest, k - 1)
        if found is not None:
            return found | {w}
    return None

E = ['AB', 'AC', 'AD', 'BC', 'BD', 'CD', 'CH', 'DE', 'DF', 'EF', 'FG', 'GH']

print(sorted(matching_cover(E)))
# ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']
print(cover_of_size(E, 4))
# None
print(sorted(cover_of_size(E, 5)))
# ['A', 'B', 'D', 'F', 'H']
Links: die Matchingkanten A-B, C-D, E-F und G-H dick in Orange gezeichnet, wobei alle acht Knoten in die Überdeckung aufgenommen sind. Rechts: eine kleinste Überdeckung A, B, D, F, H aus fünf Knoten, mit den Matchingkanten zum Vergleich.
Das Matching aus vier Kanten zwingt mindestens vier Knoten in jede Überdeckung, und das Verfahren nimmt acht. Das Optimum, fünf, liegt dazwischen.

Im Beispiel besteht das Matching aus AB, CD, EF und GH, und das Verfahren nimmt alle acht Knoten. Das ist eine schlechte Überdeckung, aber das Matching beweist auch, dass keine Überdeckung weniger als vier Knoten hat, sodass das Verfahren weiß, dass seine eigene Antwort innerhalb eines Faktors 2 liegt, ohne das Optimum zu kennen. Eine verlockende Alternative, wiederholt den Knoten mit dem höchsten Grad zu nehmen, hat keine solche Garantie: Auf sorgfältig konstruierten Graphen kann ihre Überdeckung um einen Faktor schlechter als das Optimum sein, der mit der Größe des Graphen wächst.

Die zweite Eigenschaft ist, dass sich kleine Überdeckungen leicht exakt finden lassen. Jede Kante uv muss u oder v in der Überdeckung haben, daher probiert die Funktion cover_of_size beides aus und fährt mit einem Budget von k − 1 fort. Der Suchbaum hat höchstens die Tiefe k und höchstens 2k Blätter, unabhängig von der Zahl der Knoten. Im Beispiel meldet sie, dass es keine Überdeckung mit 4 Knoten gibt, und findet eine mit 5. Mit k = 20 hat der Baum höchstens etwa eine Million Blätter, so groß der Graph auch ist: Der Umfang der Suche hängt von der Größe der Überdeckung ab, nicht von der Zahl der Knoten. Probleme mit diesem Verhalten heißen festparameterberechenbar.

Eine Vorverarbeitungsregel aus der Arbeit von Buss und Goldsmith von 1993 verkleinert zuerst die Eingabe. Ein Knoten mit mehr als k Nachbarn muss in jeder Überdeckung der Größe k liegen, weil sonst alle seine Nachbarn nötig wären. Nachdem solche Knoten genommen sind, überdeckt jeder verbleibende Knoten höchstens k Kanten; wenn also mehr als k2 Kanten übrig bleiben, lautet die Antwort nein. Der beste bekannte exakte Algorithmus, von Chen, Kanj und Xia aus dem Jahr 2010, läuft in O(1,2738k + kn) Zeit.

7. Wie schwer sind diese Probleme?

Zu entscheiden, ob ein Graph eine Clique der Größe k hat, ist NP-vollständig, und ebenso zu entscheiden, ob er eine Knotenüberdeckung der Größe k hat. Beide standen auf Karps Liste von 21 NP-vollständigen Problemen aus dem Jahr 1972, und die unabhängige Menge folgt aus jedem der beiden über die Identitäten aus Abschnitt 2. Für keines von ihnen ist ein Polynomialzeitalgorithmus bekannt, und einen zu finden würde P = NP beweisen.

Die Identitäten erhalten exakte Antworten, aber keine Näherungen, und hier gehen die drei Probleme auseinander. Die Knotenüberdeckung lässt sich innerhalb eines Faktors 2 approximieren, wie Abschnitt 6 zeigte. Clique und unabhängige Menge lassen sich im Wesentlichen gar nicht approximieren: Håstad bewies 1999, dass für jedes ε > 0 kein Polynomialzeitalgorithmus die größte Clique innerhalb eines Faktors n1−ε approximiert, außer wenn NP = ZPP gilt, und Zuckerman zeigte 2007, dass dasselbe schon unter der alleinigen Annahme P ≠ NP gilt. Eine kleine Rechnung zeigt, warum die Identität die Garantie nicht überträgt: In einem Graphen mit 1.000 Knoten und τ = 500 liegt eine Überdeckung aus 1.000 Knoten innerhalb eines Faktors 2, doch die unabhängige Menge, die sie übrig lässt, ist leer.

Selbst der Faktor 2 für die Knotenüberdeckung könnte das Ende der Fahnenstange sein. Dinur und Safra bewiesen 2005, dass ihre Approximation innerhalb eines Faktors 1,36 NP-schwer ist, und Khot und Regev bewiesen 2008, dass ein Faktor 2 − ε schwer ist, falls die Unique-Games-Vermutung zutrifft. Auch das parametrisierte Bild unterscheidet sich. Die Knotenüberdeckung ist festparameterberechenbar, wie Abschnitt 6 zeigte, während das Finden einer Clique der Größe k vollständig für die Klasse W[1] ist, wie Downey und Fellows 1995 bewiesen, was ein starkes Indiz dafür ist, dass es dafür keinen Algorithmus mit Laufzeit f(k) · nc gibt.

8. Schranken, die Sie von Hand prüfen können

Da die exakten Zahlen schwer zu berechnen sind, sind einfache Schranken wertvoll, und mehrere davon verbinden diese Probleme mit Färbungen und Graden.

9. Ramsey-Theorie: Ordnung ist unvermeidlich

Der Satz von Turán besagt, dass dichte Graphen große Cliquen enthalten. Die Ramsey-Theorie sagt etwas Stärkeres: Jeder große Graph enthält eine große Clique oder eine große unabhängige Menge, unabhängig von seiner Dichte. Die Ramsey-Zahl R(s, t) ist das kleinste n mit der Eigenschaft, dass jeder Graph auf n Knoten eine Clique der Größe s oder eine unabhängige Menge der Größe t enthält. Ramsey bewies 1930, dass diese Zahlen existieren.

Links: fünf Personen als Fünfeck; die äußeren Kanten sind Freundschaften in durchgezogenem Blau und die inneren Pentagrammkanten Fremde in gestricheltem Orange, und es gibt kein einfarbiges Dreieck. Rechts: eine Person v mit Freundschaftskanten zu x, y und z; jede Freundschaft unter x, y und z schließt mit v ein Dreieck, und gibt es keine, sind x, y und z drei einander Fremde.
Das Partyproblem. Fünf Personen können sowohl ein Trio von Freunden als auch ein Trio von Fremden vermeiden, sechs nicht.

Der kleinste Fall ist das Partyproblem: Unter je sechs Personen gibt es drei, die alle miteinander befreundet sind, oder drei, die einander alle fremd sind, also R(3, 3) = 6. Der Beweis passt in wenige Zeilen. Wählen Sie eine beliebige Person v. Von den anderen fünf sind mindestens drei mit v befreundet oder mindestens drei sind v fremd; etwa die drei Freunde x, y und z. Sind zwei von ihnen befreundet, bilden sie mit v ein Trio von Freunden. Sind keine zwei befreundet, so sind x, y und z drei einander Fremde. Fünf Personen genügen nicht: Ordnen Sie sie in einem Fünfeck an, machen Sie Nachbarn zu Freunden und alle anderen zu Fremden, dann tritt kein Trio der einen oder anderen Art auf. Eine Brute-Force-Prüfung aller 32.768 Möglichkeiten, 15 Paare von sechs Personen als befreundet oder fremd zu markieren, bestätigt das Ergebnis.

Über die kleinsten Fälle hinaus sind Ramsey-Zahlen berüchtigt schwer. Greenwood und Gleason fanden R(4, 4) = 18 im Jahr 1955. Für R(5, 5) zeigte Exoo 1989, dass sie mindestens 43 ist, und Angeltveit und McKay bewiesen 2024 nach jahrzehntelangen Berechnungen, dass sie höchstens 46 ist; der genaue Wert ist weiterhin unbekannt. Für allgemeines k bewiesen Erdős und Szekeres 1935, dass R(k, k) kleiner ist als 4k, und Erdős bewies 1947 die untere Schranke 2k/2 durch den Nachweis, dass ein Zufallsgraph meist weder eine große Clique noch eine große unabhängige Menge hat, eine der ersten Anwendungen der probabilistischen Methode. Spätere Arbeiten verbesserten die obere Schranke, doch die Basis 4 hielt sich, bis Campos, Griffiths, Morris und Sahasrabudhe sie auf (4 − ε)k senkten, in einer erstmals 2023 veröffentlichten Arbeit.

10. Spezielle Graphen, in denen die Probleme leicht werden

NP-Schwere ist eine Aussage über alle Graphen. Viele Graphklassen, die in der Praxis auftreten, haben eine Struktur, die diese Probleme handhabbar macht.

11. Wo Cliquen, unabhängige Mengen und Überdeckungen eingesetzt werden

12. Häufige Fehler

FehlerWarum es falsch istAbhilfe
Eine maximale Menge für maximum halten{D, E, F} kann nicht wachsen, doch die größte Clique hat 4 KnotenAngeben, welche von beiden eine Routine liefert; die meisten schnellen Verfahren liefern maximale Mengen
Der gierigen Reihenfolge vertrauenWer mit dem meistverbundenen Knoten D beginnt, endet bei {D, G}, einen weniger als α = 3Für kleine Graphen exakte Suche verwenden und gierige Ergebnisse als untere Schranke behandeln
Unabhängige Menge über die Knotenüberdeckung approximierenEine Überdeckung innerhalb eines Faktors 2 kann eine leere unabhängige Menge übrig lassenDie Identität α + τ = n nur für exakte Antworten verwenden
Knoten statt Kanten überdeckenEine Knotenüberdeckung muss jede Kante berühren, nicht jeden Knoten erreichenPrüfen, dass jede Kante einen Endknoten in der Menge hat; dominierende Mengen sind ein anderes Problem
Gleichheit erwarten: ω = χEin 5-Kreis hat Cliquenzahl 2 und braucht 3 FarbenDie Cliquenzahl ω als untere Schranke behandeln; Gleichheit gilt in perfekten Graphen
Cliquen ohne Pivot auflistenEinfaches Backtracking untersucht dieselben Cliquen viele MaleBron–Kerbosch mit Tomitas Pivotregel verwenden
Annehmen, dass Planarität alles leicht machtDie Knotenüberdeckung bleibt auf planaren Graphen mit Maximalgrad 3 NP-vollständigNur das Cliquenproblem wird leicht, da ω ≤ 4

13. Glossar

BegriffBedeutung
CliqueEine Menge paarweise benachbarter Knoten
Cliquenzahl, ω(G)Die Größe der größten Clique
Unabhängige MengeEine Menge von Knoten, von denen keine zwei benachbart sind; auch stabile Menge genannt
Unabhängigkeitszahl, α(G)Die Größe der größten unabhängigen Menge
KnotenüberdeckungEine Menge von Knoten, die mindestens einen Endknoten jeder Kante enthält
Knotenüberdeckungszahl, τ(G)Die Größe der kleinsten Knotenüberdeckung
MaximalLässt sich nicht erweitern, ohne die Eigenschaft zu verlieren
MaximumSo groß wie möglich unter allen Mengen mit der Eigenschaft
KomplementDer Graph mit einer Kante genau dort, wo das Original keine hat
PivotDer Knoten, mit dem Bron–Kerbosch Zweige überspringt, die keine neuen Cliquen liefern können
FestparameterberechenbarLösbar in Zeit f(k) · nc für einen Parameter k
Ramsey-Zahl, R(s, t)Die kleinste Knotenzahl mit garantierter Clique der Größe s oder garantierter unabhängiger Menge der Größe t

14. Häufig gestellte Fragen

Was ist eine Clique in der Graphentheorie?

Eine Clique ist eine Menge von Knoten, in der je zwei Knoten durch eine Kante verbunden sind, sodass die Knoten innerhalb des größeren Graphen einen vollständigen Graphen bilden. Die Größe der größten Clique ist die Cliquenzahl, geschrieben omega(G). Eine maximale Clique lässt sich nicht durch Hinzufügen eines weiteren Knotens erweitern, während eine größte Clique die größte Clique im ganzen Graphen ist.

Was ist der Unterschied zwischen maximal und maximum?

Eine maximale Menge lässt sich nicht vergrößern, ohne ihre Eigenschaft zu verlieren, aber anderswo im Graphen kann es eine größere Menge geben. Eine Menge ist maximum, wenn sie die größte ist, die es gibt. Jede größte Clique oder unabhängige Menge ist maximal, aber nicht umgekehrt, und gierige Verfahren garantieren nur eine maximale Menge.

Wie hängen unabhängige Mengen und Knotenüberdeckungen zusammen?

Eine Menge von Knoten ist genau dann unabhängig, wenn die übrigen Knoten eine Knotenüberdeckung bilden. In jedem Graphen mit n Knoten ist daher die Unabhängigkeitszahl plus die Knotenüberdeckungszahl gleich n, eine Identität, die Gallai zugeschrieben wird. Eine größte unabhängige Menge und eine kleinste Knotenüberdeckung sind Komplemente voneinander, und eine Clique in einem Graphen ist eine unabhängige Menge in seinem Komplement.

Ist das Problem der größten Clique NP-schwer?

Ja. Zu entscheiden, ob ein Graph eine Clique einer gegebenen Größe hat, ist NP-vollständig und stand auf Karps Liste von 21 NP-vollständigen Problemen aus dem Jahr 1972, ebenso wie die Knotenüberdeckung. Das Cliquenproblem ist außerdem schwer zu approximieren: Kein Polynomialzeitalgorithmus kann die größte Clique innerhalb eines Faktors n hoch 1 minus Epsilon approximieren, außer wenn P gleich NP ist.

Wie approximiert man eine kleinste Knotenüberdeckung?

Man wählt wiederholt eine Kante, die keinen Endknoten in der Überdeckung hat, und fügt beide Endknoten hinzu. Die gewählten Kanten bilden ein maximales Matching, und jede Überdeckung braucht mindestens einen Endknoten jeder dieser Kanten, also ist das Ergebnis höchstens doppelt so groß wie das Optimum. Besser als etwa das 1,36-Fache des Optimums zu sein ist NP-schwer, und besser als das Zweifache ist schwer, falls die Unique-Games-Vermutung gilt.

Was macht der Bron-Kerbosch-Algorithmus?

Der Bron-Kerbosch-Algorithmus listet durch Backtracking jede maximale Clique eines Graphen auf. Er führt die aktuelle Clique, die Kandidaten, die sie erweitern könnten, und die bereits untersuchten Knoten. Mit einem gut gewählten Pivot läuft er im schlechtesten Fall in O(3 hoch n/3) Zeit, was optimal ist, weil ein Graph so viele maximale Cliquen haben kann.

15. Quellen

Die Definitionen, Sätze und Zuschreibungen oben stammen aus diesen Quellen, in chronologischer Reihenfolge.

  1. Mantel, W. (1907). "Problem 28 (Solution by H. Gouwentak, W. Mantel, J. Teixeira de Mattes, F. Schuh and W. A. Wythoff)." Wiskundige Opgaven 10, 60 bis 61.
  2. Ramsey, F. P. (1930). "On a Problem of Formal Logic." Proceedings of the London Mathematical Society s2-30, 264 bis 286.
  3. Kőnig, D. (1931). "Gráfok és mátrixok." Matematikai és Fizikai Lapok 38, 116 bis 119.
  4. Erdős, P. und Szekeres, G. (1935). "A Combinatorial Problem in Geometry." Compositio Mathematica 2, 463 bis 470.
  5. Turán, P. (1941). "Egy gráfelméleti szélsőértékfeladatról." Matematikai és Fizikai Lapok 48, 436 bis 452.
  6. Erdős, P. (1947). "Some Remarks on the Theory of Graphs." Bulletin of the American Mathematical Society 53, 292 bis 294.
  7. Luce, R. D. und Perry, A. D. (1949). "A Method of Matrix Analysis of Group Structure." Psychometrika 14(2), 95 bis 116.
  8. Greenwood, R. E. und Gleason, A. M. (1955). "Combinatorial Relations and Chromatic Graphs." Canadian Journal of Mathematics 7, 1 bis 7.
  9. Gallai, T. (1959). "Über extreme Punkt- und Kantenmengen." Annales Universitatis Scientiarum Budapestinensis de Rolando Eötvös Nominatae, Sectio Mathematica 2, 133 bis 138.
  10. Moon, J. W. und Moser, L. (1965). "On Cliques in Graphs." Israel Journal of Mathematics 3, 23 bis 28.
  11. Gavril, F. (1972). "Algorithms for Minimum Coloring, Maximum Clique, Minimum Covering by Cliques, and Maximum Independent Set of a Chordal Graph." SIAM Journal on Computing 1(2), 180 bis 187.
  12. Karp, R. M. (1972). "Reducibility Among Combinatorial Problems." In Complexity of Computer Computations, herausgegeben von R. E. Miller und J. W. Thatcher, 85 bis 103. New York: Plenum.
  13. Bron, C. und Kerbosch, J. (1973). "Algorithm 457: Finding All Cliques of an Undirected Graph." Communications of the ACM 16(9), 575 bis 577.
  14. Barrow, H. G. und Burstall, R. M. (1976). "Subgraph Isomorphism, Matching Relational Structures and Maximal Cliques." Information Processing Letters 4(4), 83 bis 84.
  15. Garey, M. R., Johnson, D. S. und Stockmeyer, L. (1976). "Some Simplified NP-Complete Graph Problems." Theoretical Computer Science 1(3), 237 bis 267.
  16. Garey, M. R. und Johnson, D. S. (1977). "The Rectilinear Steiner Tree Problem is NP-Complete." SIAM Journal on Applied Mathematics 32(4), 826 bis 834. Knotenüberdeckung auf planaren Graphen mit Maximalgrad 3.
  17. Tarjan, R. E. und Trojanowski, A. E. (1977). "Finding a Maximum Independent Set." SIAM Journal on Computing 6(3), 537 bis 546.
  18. Caro, Y. (1979). "New Results on the Independence Number." Technischer Bericht, Universität Tel Aviv.
  19. Garey, M. R. und Johnson, D. S. (1979). Computers and Intractability: A Guide to the Theory of NP-Completeness. San Francisco: W. H. Freeman. Die 2-Approximation für die Knotenüberdeckung.
  20. Wei, V. K. (1981). "A Lower Bound on the Stability Number of a Simple Graph." Bell Laboratories Technical Memorandum 81-11217-9.
  21. Grötschel, M., Lovász, L. und Schrijver, A. (1981). "The Ellipsoid Method and Its Consequences in Combinatorial Optimization." Combinatorica 1(2), 169 bis 197.
  22. Exoo, G. (1989). "A Lower Bound for R(5, 5)." Journal of Graph Theory 13(1), 97 bis 98.
  23. Buss, J. F. und Goldsmith, J. (1993). "Nondeterminism within P." SIAM Journal on Computing 22(3), 560 bis 572.
  24. Downey, R. G. und Fellows, M. R. (1995). "Fixed-Parameter Tractability and Completeness II: On Completeness for W[1]." Theoretical Computer Science 141, 109 bis 131.
  25. Håstad, J. (1999). "Clique is Hard to Approximate within n1−ε." Acta Mathematica 182(1), 105 bis 142.
  26. Dinur, I. und Safra, S. (2005). "On the Hardness of Approximating Minimum Vertex Cover." Annals of Mathematics 162(1), 439 bis 485.
  27. Tomita, E., Tanaka, A. und Takahashi, H. (2006). "The Worst-Case Time Complexity for Generating All Maximal Cliques and Computational Experiments." Theoretical Computer Science 363(1), 28 bis 42.
  28. Zuckerman, D. (2007). "Linear Degree Extractors and the Inapproximability of Max Clique and Chromatic Number." Theory of Computing 3, 103 bis 128.
  29. Khot, S. und Regev, O. (2008). "Vertex Cover Might Be Hard to Approximate to within 2 − ε." Journal of Computer and System Sciences 74(3), 335 bis 349.
  30. Chen, J., Kanj, I. A. und Xia, G. (2010). "Improved Upper Bounds for Vertex Cover." Theoretical Computer Science 411(40–42), 3736 bis 3756.
  31. Diestel, R. (2017). Graph Theory, 5. Auflage. Graduate Texts in Mathematics 173. Berlin: Springer.
  32. Angeltveit, V. und McKay, B. D. (2024). "R(5, 5) ≤ 46." arXiv:2409.15709.
  33. Campos, M., Griffiths, S., Morris, R. und Sahasrabudhe, J. (2026). "An Exponential Improvement for Diagonal Ramsey." Annals of Mathematics 203(3), 869 bis 932. Erstmals 2023 veröffentlicht als arXiv:2303.09521.

Sehen Sie Bron–Kerbosch bei der Arbeit zu

Zeichnen Sie das Beispiel im Visualisierer und starten Sie die Suche nach maximalen Cliquen. Sie meldet alle fünf maximalen Cliquen, darunter das Dreieck und die drei Kanten, die lange vor der größten Clique aufhören zu wachsen.

Visualisierer öffnen

Eine Clique setzt das Minimum

Färben Sie das Beispiel im Visualisierer. Die Clique A, B, C, D erzwingt vier Farben, die untere Schranke, die die Cliquenzahl immer liefert, und hier genügen vier Farben.

Graphenfärbungs-Visualisierer starten