Me gustaría hacer un par de diapositivas sobre Beamer para mostrar cómo funciona un algoritmo gráfico.
Lo que necesito es poder tener al principio un gráfico. Poder tener una etiqueta adicional de los nodos, fuera de ellos, poder tener bordes ponderados y cambiar el color de los bordes. Adjunté una imagen a continuación, como ejemplo de la funcionalidad que quiero que tenga mi gráfico, pero después de investigar un poco, no encontré una manera de tener todas esas cosas.
Dado que en cada paso quiero hacer un pequeño cambio en el gráfico: marcar un nodo en negro, cambiar el color del borde, cambiar la etiqueta exterior del nodo, una solución sería copiar el código en diferentes marcos. ¿Es posible programarlo de alguna manera para que sea más fácil y en marcos más pequeños?
Respuesta1
Puede usarlo label
para el texto fuera de los estados y nodos para etiquetar los bordes.
\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 el código, se puede proporcionar el texto de la etiqueta como entrada State
cambiando la definición 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},
y luego dibujar los 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};