Gerichteter Graph mit Schnitten

Gerichteter Graph mit Schnitten

Ich versuche, mit Tikz einen gerichteten Graphen zu setzen.

Das habe ich bisher bekommen:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows}
\tikzset{
  net node/.style = {draw, circle, minimum size=8mm},
  net edge/.style = {->, >=triangle 45}, % triangle 45 arrow is bigger than latex arrow % auto,
  net cut/.style = {shorten >=-10mm, shorten <=-10mm, rounded corners=10mm, color=red},
  net cross/.style = {sloped, allow upside down, pos=.3},
}

\begin{document}
    \begin{tikzpicture}
        \newcommand{\edge}[5][]{\draw[net edge, #1] (#3) -- coordinate[net cross, name=#2] node[pos=.7, auto]{#5} (#4);}

        \node[net node, name=s ] at ( 0, 0) {$s$};
        \node[net node, name=n1] at (-2,-2) {$n_1$};
        \node[net node, name=n2] at ( 2,-2) {$n_2$};
        \node[net node, name=t]  at ( 0,-4) {$t$};

        \edge[swap] {e1}  {s} {n1} {1}
        \edge       {e2}  {s} {n2} {1}
        \edge[swap] {e3} {n1} {n2} {1}
        \edge       {e4} {n1}  {t} {1}
        \edge       {e5} {n2}  {t} {1}

        \draw[net cut] (e1) -- (e2);
        \draw[net cut] (e4) -- (e3) -- (e2);
        \draw[net cut] (e4) -- (e5);
        \draw[net cut] (e5) -- (e3) -- (e2); % Just a test!
    \end{tikzpicture}
\end{document}

Das Ergebnis ist fast ok:

Es besteht jedoch noch Raum für Verbesserungen:

  • Irgendwie hat ein Schnitt eine scharfe Biegung. Mir ist klar geworden, dass man das umgehen kann, indem man verwendet net cross/.style = {}, aber dann liegt der Schnittpunkt in der Mitte der Kante und das möchte ich nicht

  • Es wäre toll, wenn die Schnitte die Kanten in einem Winkel von 90 Grad kreuzen würden. Ich habe es bereits versucht, indem ich die Kreuze erstellt slopedund drawmit tound inund verwendet habe out, aber es scheint, dass man keinen Winkel relativ zur Ausrichtung eines Knotens oder einer Koordinate angeben kann.

Ich möchte den Graphcode so weit oben wie möglich belassen, d. h. es wäre toll, wenn ich etwas sagen könnte wie z. B. „Ich möchte einen Schnitt über die Kanten e1, e2, e4 machen.“

Irgendwelche Ideen?

Antwort1

Ich fürchte, ich verstehe Ihre Frage nicht richtig. Sehen Sie trotzdem nach, ob die folgende Lösung ein Ergebnis liefert, das zumindest in einem Teil Ihrem Wunsch nahe kommt:

Bildbeschreibung hier eingeben

Ich habe Ihren Code komplett neu geschrieben, Sie können jedoch immer noch Teile wiederherstellen, die ich aufgrund eines Missverständnisses Ihrer Frage ausgelassen habe:

\documentclass[tikz, margin=3mm]{standalone}
\usetikzlibrary{arrows, quotes}

\begin{document}
    \begin{tikzpicture}[
xs/.style = {xshift=#1 mm},
ys/.style = {yshift=#1 mm},
every edge quotes/.style = {auto, pos=0.5, % <-- =.3?
                            inner sep=2pt, font=\footnotesize}
                        ]
    \begin{scope}[every node/.style={circle, draw, minimum size=8mm}]
\node (s)  at ( 0, 0) {$s$};
\node (n1) at (-2,-2) {$n_1$};
\node (n2) at ( 2,-2) {$n_2$};
\node (t)  at ( 0,-4) {$t$};
    \end{scope}
\draw[-triangle 45] 
    (s)  edge ["1"] (n1)
    (s)  edge ["1"] (n2)
    (n1) edge ["1"] (n2)
    (n1) edge ["1"] (t)
    (n2) edge ["1"] (t);
\draw[rounded corners=10mm, red, densely dashed] 
    ([xs=-11]  s.west)  -- ([ys=-11] s.south)   -- ([xs= 11]  s.east)
    ([xs=-11]  t.west)  -- ([ys= 11] t.north)   -- ([xs= 11]  t.east)
    ([ys= 11] n1.north) -- ([xs= 11] n1.east)   -- ([ys=-11] n1.south)
    ([ys= 11] n2.north) -- ([xs=-11] n2.west)   -- ([ys=-11] n2.south);
    \end{tikzpicture}
\end{document}

Wie Sie sehen, verwende ich die TikZ-Bibliothek quoeteszum Beschriften von Kanten zwischen Knoten. Für „Schnitte“ verwende ich gestrichelte Linien, die sich jedoch leicht in durchgezogene Linien ändern lassen. Wenn einige Schnitte mit geraden Linien ausgeführt werden müssten, sollte es nicht schwierig sein, überzählige gestrichelte Linien hinzuzufügen oder zu löschen.

verwandte Informationen