This is a subgraph isomorphism problem: http://en.wikipedia.org/wiki/Subgraph_isomorphism_problem
There is one algorithm mentioned in the article due to Ullman.
Ullman's algorithm is an extension of the depth search. Depth search will work as follows:
def search(graph,subgraph,assignments): i=len(assignments)
For the main algorithm, possible_assignments[i] = range(0,graph.n_vertices) . That is, all the vertices are possible.
Ullmann extends this basic algorithm, narrowing the possibilities:
def update_possible_assignements(graph,subgraph,possible_assignments): any_changes=True while any_changes: any_changes = False for i in range(0,len(subgraph.n_vertices)): for j in possible_assignments[i]: for x in subgraph.adjacencies(i): match=False for y in range(0,len(graph.n_vertices)): if y in possible_assignments[x] and graph.has_edge(j,y): match=True if not match: possible_assignments[i].remove(j) any_changes = True
The idea is that if the node i of the subgraph can correspond to the node j of the graph, then for each node x adjacent to node i in the subgraph, it should be possible to find the node y adjacent to node j on the graph. This process helps more than it may be obvious at first, because every time we eliminate a possible assignment, it can lead to the elimination of other possible assignments, since they are interdependent.
The final algorithm:
def search(graph,subgraph,assignments,possible_assignments): update_possible_assignments(graph,subgraph,possible_assignments) i=len(assignments)