\documentclass[12pt]{article}

\usepackage{tikz}
\usetikzlibrary{automata,positioning}

\begin{document}
\begin{tikzpicture}[shorten >=1pt,node distance=2.5cm,on grid,auto] 
   % \node[state, options?] (target identifier) [placement] {display label};
   
   \node[state, initial] (a) {s};
   \node[state, accepting] (anything) [below=of a] {$acc$}; 
   \node[state, accepting] (c) [above left=of a] {}; % Can also go diagonally
   % Basic fine adjustment
   \node[state] (d) [right=3cm of a] {$d$}; 
   % More precise fine adjustment: positive X, Y shift is up right
   \node[state] (e) [below=of d, xshift=1cm, yshift=1cm] {$e$};  
   \node[state, accepting] (f) [below=of e, xshift=-1cm]  {$f$};
   \node[state, accepting] (g) [below=of f]  {$g$};
   \node[state, accepting] (i) [right=of g] {i};
   \node[state] (h) [above=of i] {h};
   
   % Indentation is for ease of reading, isn't necessary. Refer to names in (), not display names in {}
   % (start identifier) edge [options?] node {display label} (target identifier)
   % 		               edge [options?] node {display label} (another target identifier)        
                      
    \path[->] 
    (a) edge node {text} (anything)
         edge node [right] {$0, 1$} (c) % Putting the label on the other side of the edge
         edge node {} (f)
    (d) edge node {} (e)
    % Looping to self
    (e) edge [loop right] node {self} ()
         edge [loop left] node {self} ()
    % Bend left to get cross path labels to work nicely
    (f) edge [bend left=10] node {left} (g) 
        edge [bend left=10] node {left} (h)
    (g) edge [bend left=10] node {left} (f)
         edge [bend right=10] node {right} (i)
    (h) edge [bend right=10] node {right} (i)
         edge [bend left=10] node {left} (f)
    (i) edge [bend right=10] node {right} (h)
        edge [bend right=10] node {right} (g); % Last one gets a semicolon
\end{tikzpicture}
\end{document}