digraph finite_state_machine { rankdir=LR; size="8,5" subgraph cluster_c2 { label="Accepting"; graph[style = dotted]; node [shape = doublecircle]; 3 -> 4 [label = "i"]; 4 -> 3 [label = "o" constraint=false]; } subgraph cluster_c1 { label="Non-accepting"; graph[style = dotted]; node [shape = circle]; 0 -> 1 [label = "c"]; 1 -> 2 [label = "o"]; 2 -> 2 [label = "o"]; 2 -> 3 [label = "l"]; } // Create an invisible point called START, so our starting state gets an arrow node [shape=point]; START [style=invis]; START -> 0; }