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?
Responder1
Você pode usar label
para 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}
Para simplificar o código, o texto do rótulo pode ser fornecido como uma entrada State
alterando 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};