-
-
Save ericcgu/61638ae912cbe6cc5ec779209842cbf0 to your computer and use it in GitHub Desktop.
Python Implementation of Undirected Graphs (Adjacency List and Adjacency Matrix)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"{}\n", | |
"\n", | |
"{}\n", | |
"\n", | |
"\n", | |
"[\"A:['B', 'C', 'E']\", \"C:['A', 'B', 'D', 'E']\", \"B:['A', 'C', 'D']\", \"E:['A', 'C']\", \"D:['B', 'C']\"]\n", | |
"\n", | |
"[[ 0. 1. 1. 0. 1.]\n", | |
" [ 1. 0. 1. 1. 0.]\n", | |
" [ 1. 1. 0. 1. 1.]\n", | |
" [ 0. 1. 1. 0. 0.]\n", | |
" [ 1. 0. 1. 0. 0.]]\n" | |
] | |
} | |
], | |
"source": [ | |
"class Vertex:\n", | |
" def __init__(self, vertex):\n", | |
" self.name = vertex\n", | |
" self.neighbors = []\n", | |
" \n", | |
" def add_neighbor(self, neighbor):\n", | |
" if isinstance(neighbor, Vertex):\n", | |
" if neighbor.name not in self.neighbors:\n", | |
" self.neighbors.append(neighbor.name)\n", | |
" neighbor.neighbors.append(self.name)\n", | |
" self.neighbors = sorted(self.neighbors)\n", | |
" neighbor.neighbors = sorted(neighbor.neighbors)\n", | |
" else:\n", | |
" return False\n", | |
" \n", | |
" def add_neighbors(self, neighbors):\n", | |
" for neighbor in neighbors:\n", | |
" if isinstance(neighbor, Vertex):\n", | |
" if neighbor.name not in self.neighbors:\n", | |
" self.neighbors.append(neighbor.name)\n", | |
" neighbor.neighbors.append(self.name)\n", | |
" self.neighbors = sorted(self.neighbors)\n", | |
" neighbor.neighbors = sorted(neighbor.neighbors)\n", | |
" else:\n", | |
" return False\n", | |
" \n", | |
" def __repr__(self):\n", | |
" return str(self.neighbors)\n", | |
"\n", | |
"\n", | |
"class Graph:\n", | |
" def __init__(self):\n", | |
" self.vertices = {}\n", | |
" \n", | |
" def add_vertex(self, vertex):\n", | |
" if isinstance(vertex, Vertex):\n", | |
" self.vertices[vertex.name] = vertex.neighbors\n", | |
"\n", | |
" \n", | |
" def add_vertices(self, vertices):\n", | |
" for vertex in vertices:\n", | |
" if isinstance(vertex, Vertex):\n", | |
" self.vertices[vertex.name] = vertex.neighbors\n", | |
"\n", | |
" \n", | |
" def add_edge(self, vertex_from, vertex_to):\n", | |
" if isinstance(vertex_from, Vertex) and isinstance(vertex_to, Vertex):\n", | |
" vertex_from.add_neighbor(vertex_to)\n", | |
" if isinstance(vertex_from, Vertex) and isinstance(vertex_to, Vertex):\n", | |
" self.vertices[vertex_from.name] = vertex_from.neighbors\n", | |
" self.vertices[vertex_to.name] = vertex_to.neighbors\n", | |
" \n", | |
" def add_edges(self, edges):\n", | |
" for edge in edges:\n", | |
" self.add_edge(edge[0],edge[1]) \n", | |
" \n", | |
" def adjacencyList(self):\n", | |
" if len(self.vertices) >= 1:\n", | |
" return [str(key) + \":\" + str(self.vertices[key]) for key in self.vertices.keys()] \n", | |
" else:\n", | |
" return dict()\n", | |
" \n", | |
" def adjacencyMatrix(self):\n", | |
" if len(self.vertices) >= 1:\n", | |
" self.vertex_names = sorted(g.vertices.keys())\n", | |
" self.vertex_indices = dict(zip(self.vertex_names, range(len(self.vertex_names)))) \n", | |
" import numpy as np\n", | |
" self.adjacency_matrix = np.zeros(shape=(len(self.vertices),len(self.vertices)))\n", | |
" for i in range(len(self.vertex_names)):\n", | |
" for j in range(i, len(self.vertices)):\n", | |
" for el in g.vertices[self.vertex_names[i]]:\n", | |
" j = g.vertex_indices[el]\n", | |
" self.adjacency_matrix[i,j] = 1\n", | |
" return self.adjacency_matrix\n", | |
" else:\n", | |
" return dict() \n", | |
" \n", | |
"\n", | |
"def graph(g):\n", | |
" \"\"\" Function to print a graph as adjacency list and adjacency matrix. \"\"\"\n", | |
" return str(g.adjacencyList()) + '\\n' + '\\n' + str(g.adjacencyMatrix())\n", | |
"\n", | |
"###################################################################################\n", | |
"\n", | |
"a = Vertex('A')\n", | |
"b = Vertex('B')\n", | |
"c = Vertex('C')\n", | |
"d = Vertex('D')\n", | |
"e = Vertex('E')\n", | |
"\n", | |
"a.add_neighbors([b,c,e]) \n", | |
"b.add_neighbors([a,c])\n", | |
"c.add_neighbors([b,d,a,e])\n", | |
"d.add_neighbor(c)\n", | |
"e.add_neighbors([a,c])\n", | |
" \n", | |
" \n", | |
"g = Graph()\n", | |
"print graph(g)\n", | |
"print \n", | |
"g.add_vertices([a,b,c,d,e])\n", | |
"g.add_edge(b,d)\n", | |
"print\n", | |
"print graph(g)" | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 2", | |
"language": "python", | |
"name": "python2" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 2 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython2", | |
"version": "2.7.11" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 0 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment