Mostrando um algoritmo gráfico

Mostrando um algoritmo gráfico

Gostaria de fazer alguns slides no Beamer para mostrar como funciona um algoritmo gráfico.

O que eu preciso é poder ter no início um gráfico. Poder ter uma etiqueta adicional dos nós, fora deles, poder ter arestas ponderadas e mudar a cor das arestas. Anexei uma imagem abaixo, como exemplo da funcionalidade que desejo que meu gráfico tenha, mas depois de algumas pesquisas, não encontrei uma maneira de ter todas essas coisas.

Como a cada passo quero fazer uma pequena mudança no gráfico - marcar um nó em preto, mudar a cor da borda, mudar o rótulo externo do nó, uma solução seria copiar o código em quadros diferentes. É possível programá-lo de uma forma que seja mais fácil e em quadros menores?

Este é um exemplo de como quero que meu gráfico fique

Responder1

Você pode usar labelpara o texto fora dos estados e nós para rotular as bordas.

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

insira a descrição da imagem aqui

Para simplificar o código, o texto do rótulo pode ser fornecido como uma entrada Statealterando a definição como

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

e então desenhando os estados como

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

informação relacionada