4

I have the nodes and arcs modeled in TikZ, but I'm scratching my head about how to draw the 'supply' and 'demand' double arrows (e.g. demand of 2 on node 1, supply of 2 on node 3). Can anybody help? Thanks

what I want

current code, which produces the nodes and arcs (ignoring dashed lines), the demand nodes, but not the double-tailed supply and demand arrows:

\documentclass[]{article}

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

\begin{document}
\begin{tikzpicture}
[roundnode/.style={circle,draw=black!50,thick},
supplynode/.style={circle},
 > = stealth, % arrow head style
            shorten > = 1pt, % don't touch arrow head to node
            auto,
            node distance = 3cm, % distance between nodes
            semithick % line style
]
        \node at (0,0)      [roundnode] (n1) {1};
        \node at (2.5,2.5)  [roundnode] (n2) {2};
        \node at (0.0,5.0)  [roundnode] (n3) {3};
        \node at (5.0,0.0)  [roundnode] (n4) {4};
        \node at (5.0,4.0)  [roundnode] (n5) {5};
        \node at (10.0,5.0) [roundnode] (n6) {6};
        \node at (10.0,0.0) [roundnode] (n7) {7};
        \node at (7.5,2.5)  [roundnode] (n8) {8};

        \node at (-1.0, -1.0) [supplynode] (s1) {2};
        \node at (2.5, 3.5)   [supplynode] (s2) {1};
        \node at (-1.0, 6.0)  [supplynode] (s3) {2};
        \node at (5.0,-1.0)   [supplynode] (s4) {6};
        \node at (6.0,4.0)    [supplynode] (s5) {2};
        \node at (11.0,0.0)   [supplynode] (s7) {5};

        \path[->] (n1) edge node {0} (n3);
        \path[->] (n2) edge node {3} (n1);
        \path[->] (n2) edge node {2} (n5);
        \path[->] (n3) edge node {0} (n2);
        \path[->] (n3) edge node {1} (n6);
        \path[->] (n4) edge node {1} (n1);
        \path[->] (n5) edge node {2} (n4);
        \path[->] (n6) edge node {1} (n8);
        \path[->] (n7) edge node {1} (n6);
        \path[->] (n7) edge node {4} (n4);
        \path[->] (n8) edge node {3} (n5);
        \path[->] (n8) edge node {0} (n7);



\end{tikzpicture}
\end{document}

what the above code produces: enter image description here

6
  • 2
    Welcome to Stackexchange! According to our guidelines, it would be appreciated to see some MWE to help you based on your current code. Thanks a lot! – Dave Apr 28 '19 at 13:06
  • with Implies[] from arrows.meta library? – Zarko Apr 28 '19 at 13:19
  • Thanks @Dave, what is MWE? – user1757226 Apr 28 '19 at 13:34
  • @user1757226 see tex.meta.stackexchange.com/q/228/63847. – LarrySnyder610 Apr 28 '19 at 13:36
  • well, this is only code snippet :-). *mwe*(minimal working example) is complete document beginning with \documentclass with needed packages and your definitions in preamble following with document body with your code snippet and with \end{document} on the end. – Zarko Apr 28 '19 at 13:45
4

OK, I'm sure there's a better way to organize things inside the Tikz, but I have found a sufficient answer to my question myself. Posting here for posterity.

\documentclass[]{article}

\usepackage{pgf, tikz}
\usetikzlibrary{arrows, automata, positioning, arrows.meta}

\begin{document}
\begin{tikzpicture}
[roundnode/.style={circle,draw=black!50,thick},
supplynode/.style={circle} ,
 > = stealth, % arrow head style
            shorten > = 1pt, % don't touch arrow head to node
            auto,
            node distance = 3cm, % distance between nodes
            semithick % line style
]
        \node at (0,0)      [roundnode] (n1) {1};
        \node at (2.5,2.5)  [roundnode] (n2) {2};
        \node at (0.0,5.0)  [roundnode] (n3) {3};
        \node at (5.0,0.0)  [roundnode] (n4) {4};
        \node at (5.0,4.0)  [roundnode] (n5) {5};
        \node at (10.0,5.0) [roundnode] (n6) {6};
        \node at (10.0,0.0) [roundnode] (n7) {7};
        \node at (7.5,2.5)  [roundnode] (n8) {8};

        \node at (-1.0, -1.0) [supplynode] (s1) {2};
        \node at (2.5, 4.0)   [supplynode] (s2) {1};
        \node at (-1.0, 6.0)  [supplynode] (d3) {2};
        \node at (5.0,-1.5)   [supplynode] (s4) {6};
        \node at (6.5,4.0)    [supplynode] (d5) {2};
        \node at (11.5,0.0)   [supplynode] (d7) {5};

        \path[->] (n1) edge node {0} (n3);
        \path[->] (n2) edge node {3} (n1);
        \path[->] (n2) edge node {2} (n5);
        \path[->] (n3) edge node {0} (n2);
        \path[->] (n3) edge node {1} (n6);
        \path[->] (n4) edge node {1} (n1);
        \path[->] (n5) edge node {2} (n4);
        \path[->] (n6) edge node {1} (n8);
        \path[->] (n7) edge node {1} (n6);
        \path[->] (n7) edge node {4} (n4);
        \path[->] (n8) edge node {3} (n5);
        \path[->] (n8) edge node {0} (n7);

        \draw[-Implies,line width=1pt,double distance=2pt] (n1) -- (s1);
        \draw[-Implies,line width=1pt,double distance=2pt] (n2) -- (s2);
        \draw[-Implies,line width=1pt,double distance=2pt] (d3) -- (n3);
        \draw[-Implies,line width=1pt,double distance=2pt] (n4) -- (s4);
        \draw[-Implies,line width=1pt,double distance=2pt] (d5) -- (n5);
        \draw[-Implies,line width=1pt,double distance=2pt] (d7) -- (n7);
\end{tikzpicture}
\end{document}

produces this, which is sufficient for my needs. Thanks @Zarko for the tip. enter image description here

4

let me convert my comments to the answer ... with some off-topic sugestion :-) :

\documentclass[tikz, margin=3mm]{standalone}
\usetikzlibrary{arrows.meta, 
                quotes}

\begin{document}
    \begin{tikzpicture}[auto=left,
every edge/.style = {draw, semithick, -Stealth, shorten > = 1pt},
                        ]
    \begin{scope}[every node/.style={circle, draw=black!50, thick}]
\node at ( 0.0,0)   (n1) {1};
\node at ( 2.5,2.5) (n2) {2};
\node at ( 0.0,5.0) (n3) {3};
\node at ( 5.0,0.0) (n4) {4};
\node at ( 5.0,4.0) (n5) {5};
\node at (10.0,5.0) (n6) {6};
\node at (10.0,0.0) (n7) {7};
\node at ( 7.5,2.5) (n8) {8};
    \end{scope}
    \begin{scope}[every node/.style={circle}]
\node at (-1.0,-1.0) (s1) {2};
\node at ( 2.5, 4.0) (s2) {1};
\node at (-1.0, 6.0) (d3) {2};
\node at ( 5.0,-1.5) (s4) {6};
\node at ( 6.5, 4.0) (d5) {2};
\node at (11.5, 0.0) (d7) {5};
    \end{scope}
\path   (n1) edge ["0"] (n3)
        (n2) edge ["3"] (n1)
        (n2) edge ["2"] (n5)
        (n3) edge ["0"] (n2)
        (n3) edge ["1"] (n6)
        (n4) edge ["1"] (n1)
        (n5) edge ["2"] (n4)
        (n6) edge ["1"] (n8)
        (n7) edge ["1"] (n6)
        (n7) edge ["4"] (n4)
        (n8) edge ["3"] (n5)
        (n8) edge ["0"] (n7);
    \begin{scope}[every edge/.style = {draw, -Implies, semithick, double distance=1pt}]
\path   (n1) edge (s1)
        (n2) edge (s2)
        (d3) edge (n3)
        (n4) edge (s4)
        (d5) edge (n5)
        (d7) edge (n7);
    \end{scope}
\end{tikzpicture}
\end{document}

above mwe gives:

enter image description here

2
  • Thanks, Zarko. Your solution is a much more elegant use of Tikz. My solution is definitely brute-force copy/paste to get the job done. – user1757226 Apr 28 '19 at 15:08
  • @user1757226, to be precise: your answer with my suggestion :-), and my answer with my suggestion + off-topic improvements ;-) – Zarko Apr 28 '19 at 16:10
1

I would use loops to avoid repetition and pins for the double arrows, which can be attached with \node also.

\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{arrows.meta}
\begin{document}
\begin{tikzpicture}[roundnode/.style={circle,draw=black!50,thick},
supplynode/.style={circle},
every pin edge/.append style={line width=1pt,double distance=2pt,draw},
 > = stealth, % arrow head style
 shorten > = 1pt, % don't touch arrow head to node
 semithick % line style
]
  \foreach [count=\X] \Coord in 
  {(0,0),(2.5,2.5),(0.0,5.0),(5.0,0.0),(5.0,4.0),(10.0,5.0),(10.0,0.0),(7.5,2.5)}
  {\node[roundnode] (n\X) at \Coord {\X};}
  \foreach \X/\Y/\Z in {1/below left/2,2/above/1,4/below/6}
  {\node also  [pin={[pin distance=8mm,pin edge={-Implies}]\Y:\Z}]  (n\X);}
  \foreach \X/\Y/\Z in {3/above left/2,5/right/2,7/right/5}
  {\node also  [pin={[pin distance=8mm,pin edge={Implies-}]\Y:\Z}]  (n\X);}
  \foreach \X/\Y/\Z in {1/0/3,2/3/1,2/2/5,3/0/2,3/1/6,4/1/1,5/2/4,6/1/8,7/1/6,7/4/4,8/3/5,8/0/7}
  {\draw[->] (n\X) -- (n\Z) node[midway,auto]{\Y};} 
\end{tikzpicture}
\end{document}

enter image description here

One could reduce it to two loops at the expense of introducing some ifs. With graphdrawing one could avoid the need of introducing explicit coordinates and/or distances altogether but this would require lualatex.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.