digraph G {
  // leave some space for the head/taillabels
  graph [ranksep=1.5 splines=true overlap=false]

  // to avoid confusion, remember this:
  // it's spelt tail/head, but it's read start/end

  // put head/tail labels farther from the node
  edge [labeldistance=3]

  // not interested in node labels
  node [shape=circle width=0.5 label=""]

  {
    edge [dir=back samehead=ahead samearrowhead=1]
    a->Z [arrowtail=none taillabel=none]
    b->Z [arrowtail=normal taillabel=normal]
    c->Z [arrowtail=inv taillabel=inv]
    d->Z [arrowtail=dot taillabel=dot]
    e->Z [arrowtail=odot taillabel=odot]
    f->Z [arrowtail=invdot taillabel=invdot]
    g->Z [arrowtail=invodot taillabel=invodot]
    h->Z [arrowtail=open taillabel=open]
    i->Z [arrowtail=halfopen taillabel=halfopen arrowhead=inv headlabel=samehead]
    j->Z [arrowtail=empty taillabel=empty]
    k->Z [arrowtail=invempty taillabel=invempty]
    l->Z [arrowtail=diamond taillabel=diamond]
    m->Z [arrowtail=odiamond taillabel=odiamond]
    n->Z [arrowtail=box taillabel=box]
    o->Z [arrowtail=obox taillabel=obox]
    p->Z [arrowtail=tee taillabel=tee]
    q->Z [arrowtail=crow taillabel=crow]
  }
  {
    edge [sametail=atail samearrowtail=1]
    Z->A [arrowhead=none headlabel=none]
    Z->B [arrowhead=normal headlabel=normal]
    Z->C [arrowhead=inv headlabel=inv]
    Z->D [arrowhead=dot headlabel=dot]
    Z->E [arrowhead=odot headlabel=odot]
    Z->F [arrowhead=invdot headlabel=invdot]
    Z->G [arrowhead=invodot headlabel=invodot]
    Z->H [arrowhead=open headlabel=open]
    Z->I [arrowhead=halfopen headlabel=halfopen arrowtail=inv taillabel=sametail]
    Z->J [arrowhead=empty headlabel=empty]
    Z->K [arrowhead=invempty headlabel=invempty]
    Z->L [arrowhead=diamond headlabel=diamond]
    Z->M [arrowhead=odiamond headlabel=odiamond]
    Z->N [arrowhead=box headlabel=box]
    Z->O [arrowhead=obox headlabel=obox]
    Z->P [arrowhead=tee headlabel=tee]
    Z->Q [arrowhead=crow headlabel=crow]
  }
}
