## 10. TUTORIAL 004 : Create your first subgraph.

This tutorial will teach you how to create subgraphs. At the end of it, we will have a hierarchy of 3 graphs.

Before anything consider the following function that creates 3 nodes and 3 edges (same as in tutorial 001 ):

void buildGraph(Graph *graph)
{
//add three nodes
node n1=graph->addNode();
node n2=graph->addNode();
node n3=graph->addNode();
//add three edges
graph->addEdge(n2,n3);
graph->addEdge(n1,n2);
graph->addEdge(n3,n1);
}

The creation of a subgraph is quite simple. You just have to use the function `Graph* addSubGraph (BooleanProperty* selection = 0) `

. It will create and return a new SubGraph of the graph. The elements of the new subgraph are those selected in the selection(selection associated value equals true); if there is no selection an empty subgraph is returned.

In the following sample we create 3 empty subgraphs :

//build three empty subgraphs
Graph *subgraph0=graph->addSubGraph();
Graph *subgraph1=graph->addSubGraph();
Graph *subgraph2=subgraph1->addSubGraph();

We now need to create some nodes and edges :

//add node inside subgraphs
buildGraph(subgraph0);
buildGraph(subgraph1);
buildGraph(subgraph2);

Following is the hierarchy we have just created, displayed with tulip :

We can check that by iterating on our graph's subgraphs using the function `Iterator< Graph * >* Graph::getSubGraphs()`

:

//iterate subgraph (0 and 1 normally ) and output them
Iterator<Graph *> *itS=graph->getSubGraphs();
while (itS->hasNext())
cout << itS->next() << endl;
delete itS;

#include <iostream>
#include <tulip/Graph.h>
/**
* Tutorial 004
*
* Create a graph and three subgraphs,
* display all the structure using iterators
*/
using namespace std;
using namespace tlp;
void buildGraph(Graph *graph) {
//add three nodes
node n1=graph->addNode();
node n2=graph->addNode();
node n3=graph->addNode();
//add three edges
graph->addEdge(n2,n3);
graph->addEdge(n1,n2);
graph->addEdge(n3,n1);
}
int main() {
//create an empty graph
Graph *graph=tlp::newGraph();
//build the graph
buildGraph(graph);
//build two empty subgraph
Graph *subgraph0=graph->addSubGraph();
Graph *subgraph1=graph->addSubGraph();
Graph *subgraph2=subgraph1->addSubGraph();
//add node inside subgraphs
buildGraph(subgraph0);
buildGraph(subgraph1);
buildGraph(subgraph2);
//iterate subgraph (0 and 1 normally ) and output them
Iterator<Graph *> *itS=graph->getSubGraphs();
while (itS->hasNext())
cout << itS->next() << endl;
delete itS;
delete graph;
return EXIT_SUCCESS;
}