Демонстрация графического алгоритма

Демонстрация графического алгоритма

Я хотел бы сделать пару слайдов по Beamer, чтобы показать, как работает алгоритм графа.

Мне нужно иметь возможность иметь в начале граф. Иметь возможность иметь дополнительную метку узлов, вне их, иметь взвешенные ребра и менять цвет ребер. Я прикрепил изображение ниже, как пример того, какую функциональность я хочу, чтобы имел мой граф, но после некоторых исследований я не нашел способа иметь все эти вещи.

Поскольку на каждом шаге я хочу внести небольшие изменения в график - пометить один узел черным, изменить цвет ребра, изменить внешнюю метку узла, одним из решений было бы копирование кода на разные кадры. Можно ли запрограммировать это так, чтобы было проще и на меньших кадрах?

Это пример того, как я хочу, чтобы выглядел мой график.

решение1

Вы можете использовать labelдля текста за пределами состояний и узлов для обозначения краев.

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning,arrows.meta}
\tikzset{%
  node distance=2cm,
  State/.style={%
    draw,circle,
    thick,
    color=black!60!green,
    inner sep=0pt,
    minimum size=10mm,
    fill=blue!40!green,
    text=white,
  },
  StateMark/.style={%
    State,
    fill=black},
  Edge/.style={%
    color=blue!40!green,
    very thick,
    -{Triangle[scale=1.1]},%% Try Latex instead oc Triangle
    text=black,
  },
  EdgeMark/.style={%
    Edge,
    color=blue!90!green,
    text=black,
  }
}
\begin{document}
\begin{tikzpicture}
  \node[StateMark,label=90:r] (S1) {$\infty$};
  \node[StateMark,label=90:s,right=of S1] (S2){0};
  \node[State,label=90:t,right=of S2] (S3){2};
  \node[State,label=90:x,right=of S3] (S4){6};
  %%
  \draw[Edge] (S1) -- node[above,pos=0.5]{5} (S2);
  \draw[Edge] (S1) to[bend right] node[below,pos=0.5]{5} (S3);%% Default bend = 30 degrees
  \draw[EdgeMark] (S2) -- node[above,pos=0.5]{2} (S3);
  \draw[EdgeMark] (S2) to[bend left=40] node[above,pos=0.5]{5} (S4);
  \draw[Edge] (S3) -- node[above,pos=0.5]{7} (S4);  
\end{tikzpicture}
\end{document}

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

Для упрощения кода текст метки можно задать в качестве входных данных, Stateизменив определение следующим образом:

  State/.style={%
    draw,circle,
    thick,
    color=black!60!green,
    inner sep=0pt,
    minimum size=10mm,
    fill=blue!40!green,
    text=white,
    label=90:#1,
  },
  StateMark/.style={%
    State=#1,
    fill=black},

и затем рисуем состояния как

  \node[StateMark=r] (S1) {$\infty$};
  \node[StateMark=s,right=of S1] (S2){0};
  \node[State=t,right=of S2] (S3){2};
  \node[State=x,right=of S3] (S4){6};

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