5
$\begingroup$

I need to add either a vertex or an edge to a graph, and also sometimes, vertices or edges, or a mixture of the two. How to write a function for this?

$\endgroup$
  • $\begingroup$ Qiang, this also is forgotten in 6 years:) $\endgroup$ – kglr Jul 22 '18 at 8:02
8
$\begingroup$

Update: Can I add a mixture list of vertices and edges to an existing graph?

ClearAll[addToGraph]
addToGraph[g_Graph, stuffToAdd_] := Fold[
 If[Head[#2] === UndirectedEdge || Head[#2] === DirectedEdge, EdgeAdd, VertexAdd]@ ## &,
 g, stuffToAdd]

Example:

g = Graph[{a, b, c}, {a <-> b, b <-> c, c <-> a}, 
 VertexLabels -> Placed["Name", Center], VertexSize -> Scaled[.1], 
 VertexLabelStyle -> 18, AspectRatio -> 1];

addToGraph[g, {d, d <-> a, e, h <-> a}]

enter image description here

Original answer:

The functions you need are VertexAdd, EdgeAdd, and their relatives VertexDelete and EdgeDelete.

For the graph

g = Graph[{a, b, c}, {a <-> b, b <-> c, c <-> a}, 
 VertexLabels -> Placed["Name", Center], VertexSize -> Scaled[.1], 
 VertexLabelStyle -> 18, AspectRatio -> 1]

enter image description here

Adding a vertex

VertexAdd[g, d]

enter image description here

Adding an edge

EdgeAdd[g, d <-> a]

enter image description here

Deleting an edge

EdgeDelete[g, c <-> a]

enter image description here

$\endgroup$
  • $\begingroup$ Can I add a mixture list of vertices and edges to an existing graph? How to write such a function addToGraph[g, {4, 1 \[UndirectedEdge] 2}] which will add another vertex 4 and an edge between 1 and 2? Thank you. $\endgroup$ – Qiang Li Feb 17 '12 at 23:16
  • 1
    $\begingroup$ I don't know of a built-in function that does that. But, it seems straightforward to do define a composite function that does both: addToGraph[g_, newvertices_List, newedges_List]:= (VertexAdd[g,newvertices];EdgeAdd[g,newedges];). Use it as h=addToGraph[g,{d,e},{a->d,a->e}] to add two new vertices and two new edges to graph g to get a new graph h. $\endgroup$ – kglr Feb 17 '12 at 23:35
  • $\begingroup$ I guess I wanted to know what if I mixed the newvertices_List and newedges_List in a single list? $\endgroup$ – Qiang Li Feb 18 '12 at 0:20
  • $\begingroup$ @QiangLi, you need modify slightly to parse the new stuff into vertex and edge parts. For example, let newstuff = {a, a \[UndirectedEdge] b, b \[UndirectedEdge] e, d, b}. Then, you can use newedges=Cases[newstuff, _ \[UndirectedEdge] _]; newvertices = Complement[newstuff, newedges] as the first two steps of the composite function on the right hand side. That is, the function becomes `addToGraph2[g_, newstuff_]:=(newedges=Cases[newstuff, _ \ [UndirectedEdge] _]; newvertices = Complement[newstuff, newedges]; VertexAdd[g,newvertices];EdgeAdd[g,newedges];). $\endgroup$ – kglr Feb 18 '12 at 0:52
  • $\begingroup$ @QiangLi, you could create a new Graph with the new vertices and edges, and then use GraphUnion. $\endgroup$ – becko May 20 '12 at 16:17

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.