In python I have the following:
graph = {}
graph[1] = {}
graph[2] = {}
graph[3] = {}
graph[1][3] = graph[3]
graph[2][1] = graph[1]
graph[2][3] = graph[3]
graph[3][2] = graph[2]
this is a structure to represent a graph and that I find nice because its structure is the same as the one of one of it's nodes so I can use it directly to initiate a search (as in depth-first). The printed version of it is:
{1: {3: {2: {1: {...}, 3: {...}}}}, 2: {1: {3: {2: {...}}}, 3: {2: {...}}}, 3: {
2: {1: {3: {...}}, 3: {...}}}}
And it can be used like:
graph[1][3][2][3][2][1][3][2][1][3][2].keys()
Now, I'm curious to know how would one implement it in C++, C# and Java without resorting to "Object" tricks that would fill the code with ugly casts. For C++ I was thinking in templatemeta programming but that would generate "finite data types" when what is needed is something like
map<int,map<int,...>> or map<int,...>
In Java, I would go with a Node class which represents any node of a graph.
public class Node<T> {
private List<Node<T>> children = new ArrayList<Node<T>>();
private T value;
public Node(T value) {
this.value = value;
}
public void addChild(Node<T> child) {
this.children.add(child);
}
public Node<T> getChild(int index) {
return this.children.get(index);
}
public List<Node<T>> getChildren() {
return this.children;
}
public T getValue() {
return this.value;
}
}
If you want a graph that will contain int values you can instantiate it and use it with:
Node<Integer> graph = new Node<Integer>(10); //value of the first node is 10
graph.addChild(new Node<Integer>(-3));
graph.getChild(0).addChild(new Node<Integer>(5));
System.out.println(graph.getChild(0).getChild(0).getValue()); //prints 5
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With