This code generated zero - divisor graphs for (Subscript[Z, p]).  Enter a value for p and hit <Enter> from the number keypad, or <Shift-Enter> from your laptop.

p=4*23;
vertexlist={};
For[i=1, i<p, i++,
For[j=1, j≤i, j++,
If[Mod[i j,p]==0, AppendTo[vertexlist, i -> j]]
];
];
GraphPlot[vertexlist, VertexLabels->Automatic(*, GraphLayout -> "MultipartiteEmbedding"*)]

p=4*23;
vertexlist={};
For[i=1, i<p, i++,
For[j=1, j≤i, j++,
If[Mod[i j,p]==0, AppendTo[vertexlist, i -> j]]
];
];
GraphPlot[vertexlist, VertexLabels->Automatic, GraphLayout -> "MultipartiteEmbedding"]

p=4*23;
vertexlist={};
For[i=1, i<p, i++,
For[j=1, j≤i, j++,
If[Mod[i j,p]==0, AppendTo[vertexlist, i -> j]]
];
];
GraphPlot[vertexlist, VertexLabels->Automatic, GraphLayout -> "CircularEmbedding"]

This graph is not bipartite.  What happens if you try to graph it as a bipartite graph?

p=4*23;
vertexlist={};
For[i=1, i<p, i++,
For[j=1, j≤i, j++,
If[Mod[i j,p]==0, AppendTo[vertexlist, i -> j]]
];
];
GraphPlot[vertexlist, VertexLabels->Automatic, GraphLayout -> "BipartiteEmbedding"]