Направленный граф с разрезами

Направленный граф с разрезами

Я пытаюсь набрать ориентированный граф с помощью tikz.

Вот что у меня получилось на данный момент:

\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}

Результат почти нормальный:

Однако есть некоторые возможности для улучшения:

  • Почему-то один разрез имеет резкий изгиб. Я понял, что это можно обойти, используя net cross/.style = {}, однако тогда пересечение находится в середине края, а мне это не нужно

  • Было бы здорово, если бы разрезы пересекали края под углом 90 градусов. Я уже пробовал делать кресты slopedи использовать drawс toи inи out, однако, похоже, нельзя указать угол относительно узла или ориентации координат

Я хочу оставить код графа как можно более высокоуровневым, т. е. было бы здорово, если бы я мог сказать что-то вроде: «Я хочу сделать разрез по ребрам e1, e2, e4».

Есть идеи?

решение1

Боюсь, я не правильно понял ваш вопрос. В любом случае, посмотрите, даст ли следующее решение результат, который хотя бы в одной части близок к тому, что вам хотелось бы иметь:

введите описание изображения здесь

Я полностью переписал ваш код, однако вы все равно можете восстановить части, которые я из-за непонимания вашего вопроса пропустил:

\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}

Как видите, я использую библиотеку TikZ quoetesдля маркировки ребер между узлами. Для "разрезов" я использую пунктирную линию, но ее легко заменить на сплошную. Если некоторые разрезы должны быть сделаны прямыми линиями, не должно быть сложно добавить или удалить лишние пунктирные линии.

Связанный контент