Arian Soleimanzadeh
  • Startseite
  • Blog
  • Podcasts
  • Videos
  • Bibliothek
  • Kontakt
العربيةArabic
DeutschGerman
EnglishEnglish
فارسیPersian
한국어Korean
中文Chinese
Bereich•Schnellkontakt

Languages

Choose your interface locale

ar

العربية

Arabic

de

Deutsch

German

en

English

English

fa

فارسی

Persian

ko

한국어

Korean

zh

中文

Chinese

Termin vereinbaren

Senden Sie eine kurze Nachricht — ich antworte so bald wie möglich.

LinkedInSchnelle Antwort
Startseite/Artikel/Strongly Connected Components (SCC) — von den Grundlagen bis zur Praxis
AlgorithmsGraph AlgorithmsArtikel

Strongly Connected Components (SCC) — von den Grundlagen bis zur Praxis

Ein praxisnaher Leitfaden zu SCCs in gerichteten Graphen: gegenseitige Erreichbarkeit, Kosaraju, Condensation Graph, Komplexität, Sonderfälle und reale Anwendungen.

21. August 20269 Min. Lesezeit8 Aufrufe
#Graph#Algorithms#JavaScript#TypeScript#SCC#Kosaraju#Strongly Connected Components

Arian Soleimanzadeh

Software Engineer & Researcher

Visueller Leitfaden zu Strongly Connected Components und SCC-Zerlegung in gerichteten Graphen

Arian Soleimanzadeh

KI · Code · Produkt

Forschung + Engineering
Auf dieser Seite
Erreichbarkeit ist nicht gleich starke ZusammenhangskomponenteWarum sind SCCs praktisch wichtig?Kosaraju und TarjanWarum funktioniert das?Praxisbeispiel: zyklische AbhängigkeitenCondensation Graph

Strongly Connected Components (SCCs) sind ein zentrales Konzept in gerichteten Graphen. Ein SCC ist eine maximale Menge von Knoten, in der jeder Knoten jeden anderen über gerichtete Pfade erreichen kann.

Für zwei Knoten u und v im selben SCC gilt:

Code
12
u ~> v
v ~> u

Erreichbarkeit ist nicht gleich starke Zusammenhangskomponente

Bei:

Code
1
A -> B -> C

ist C von A aus erreichbar. Der Rückweg von C nach A muss aber nicht existieren. Deshalb gehören A und C nicht automatisch zum selben SCC.

Bei einem Zyklus wie:

Code
123
A -> B -> C
^         |
|_________|

kann dagegen jeder Knoten jeden anderen erreichen. {A, B, C} bildet daher ein SCC.

Warum sind SCCs praktisch wichtig?

Typische Einsatzgebiete sind:

  • Circular Dependencies zwischen Softwaremodulen
  • Abhängigkeiten zwischen Microservices
  • Call-Graph- und Control-Flow-Analyse
  • gerichtete soziale Netzwerke
  • State Machines
  • Build-Systeme und Package Manager
  • Komprimierung großer gerichteter Graphen

Kosaraju und Tarjan

Zwei klassische Algorithmen sind:

  1. Kosaraju
  2. Tarjan

Beide arbeiten in:

Code
1
O(V + E)

Kosaraju ist oft leichter zu verstehen, weil der Algorithmus zwei DFS-Durchläufe und einen umgekehrten Graphen verwendet.

Wie funktioniert Kosaraju?

Kosaraju besteht aus drei Schritten:

  1. DFS auf dem Originalgraphen und Speichern der Abschlussreihenfolge.
  2. Umkehren aller Kanten.
  3. DFS auf dem umgekehrten Graphen in absteigender Abschlussreihenfolge.

Jeder neue DFS-Baum im dritten Schritt entspricht genau einem SCC.

Warum funktioniert das?

Wenn jedes SCC zu einem Superknoten zusammengefasst wird, entsteht der sogenannte Condensation Graph. Dieser Graph ist immer ein DAG.

Würde zwischen den komprimierten SCCs ein Zyklus existieren, könnten sich diese Komponenten gegenseitig erreichen und müssten eigentlich zu einem größeren SCC gehören.

Die erste DFS liefert eine geeignete Reihenfolge. Nach dem Umdrehen der Kanten kann die zweite DFS die Komponenten einzeln isolieren.

JavaScript-Implementierung

JavaScript
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
function kosaraju(graph) {
  const visited = new Set();
  const order = [];
  const nodes = new Set(Object.keys(graph));

  for (const neighbors of Object.values(graph)) {
    for (const node of neighbors) nodes.add(node);
  }

  function dfs1(node) {
    visited.add(node);

    for (const next of graph[node] ?? []) {
      if (!visited.has(next)) dfs1(next);
    }

    order.push(node);
  }

  for (const node of nodes) {
    if (!visited.has(node)) dfs1(node);
  }

  const reversed = {};

  for (const node of nodes) reversed[node] = [];

  for (const [from, neighbors] of Object.entries(graph)) {
    for (const to of neighbors) reversed[to].push(from);
  }

  visited.clear();
  const components = [];

  function dfs2(node, component) {
    visited.add(node);
    component.push(node);

    for (const next of reversed[node] ?? []) {
      if (!visited.has(next)) dfs2(next, component);
    }
  }

  while (order.length) {
    const node = order.pop();

    if (!visited.has(node)) {
      const component = [];
      dfs2(node, component);
      components.push(component);
    }
  }

  return components;
}

Praxisbeispiel: zyklische Abhängigkeiten

Code
123
Auth -> User
User -> Payment
Payment -> Auth

Diese drei Module bilden einen Dependency-Zyklus und werden durch SCC-Analyse als eine zusammengehörige Komponente erkannt.

Condensation Graph

Aus:

Code
123
S1 = {A, B, C}
S2 = {D, E}
S3 = {F}

kann beispielsweise werden:

Code
1
S1 -> S2 -> S3

Das ist ein DAG und kann für Scheduling, Dependency Analysis oder weitere Graphalgorithmen wesentlich einfacher verarbeitet werden.

Komplexität

Code
12
Zeit:    O(V + E)
Speicher: O(V + E)

Der zusätzliche Speicher wird vor allem für den umgekehrten Graphen, visited-Strukturen, die Abschlussreihenfolge und das Ergebnis benötigt.

Wichtige Sonderfälle

  • Ein isolierter Knoten ist allein ein SCC.
  • Ein Self-Loop ergibt weiterhin ein SCC mit einem Knoten.
  • Ist der gesamte Graph stark zusammenhängend, existiert genau ein SCC.
  • In einem DAG ist jeder Knoten sein eigenes SCC.

SCC vs. Zyklenerkennung

Ein SCC mit mehr als einem Knoten enthält mindestens einen gerichteten Zyklus. SCC-Zerlegung ist aber umfassender als Cycle Detection: Sie partitioniert den gesamten Graphen in maximale gegenseitig erreichbare Bereiche.

Wann sollte man SCC verwenden?

SCCs sind geeignet, wenn Fragen auftreten wie:

  • Welche Knoten können sich gegenseitig erreichen?
  • Welche Dependencies bilden Zyklen?
  • Welche Module oder Services sind eng gekoppelt?
  • Wie lässt sich ein gerichteter Graph zu einem DAG komprimieren?
  • Welche Zustände einer State Machine gehören zu wiederkehrenden Bereichen?

Fazit

Kosaraju lässt sich so merken:

Code
1234567
DFS + Finishing Order
        ↓
Kanten umdrehen
        ↓
DFS in umgekehrter Reihenfolge
        ↓
SCCs

Das eigentliche Ziel besteht darin, zyklische und gegenseitig erreichbare Strukturen in gerichteten Systemen sichtbar zu machen.

Auf dieser Seite
Erreichbarkeit ist nicht gleich starke ZusammenhangskomponenteWarum sind SCCs praktisch wichtig?Kosaraju und TarjanWarum funktioniert das?Praxisbeispiel: zyklische AbhängigkeitenCondensation Graph

Artikeldetails

Veröffentlichungsdaten, Lesezeit und aktuelle Aufrufzahlen.

Veröffentlicht

21. August 2026

Aktualisiert

27. Oktober 2026

Lesezeit

9 Min. Lesezeit

Aufrufe

8

Autor

Arian Soleimanzadeh

Vorheriger Artikel

Travelling Salesman Problem (TSP): Brute Force, Held–Karp und Dynamic Programming

Nächster Artikel

Kosaraju mit JavaScript und TypeScript implementieren

Arian Soleimanzadeh

Ein persönliches Portfolio mit Fokus auf moderne Webentwicklung, UI-Systeme und praxisnahe KI-Produkte — sauberer Code, klares Design.

Schnellzugriff

  • Über mich
  • Blog
  • Bibliothek
  • Kontakt

Kontakt

  • soleimanzadeh.a.work@gmail.com
  • soleimanzadeh.uni@gmail.com

Verfügbarkeit: Wochentage

Antwortet in der Regel innerhalb von 24 Std.

Newsletter

Erhalten Sie Neuigkeiten zu Beiträgen, Projekten und neuen Veröffentlichungen.

© 2026 ariansoleimanzadeh.dev — Alle Rechte vorbehalten.

LinkedIn