#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# author: bt3gl

# dijkstra's single source shortest path algorithm
# with adjacency matrix representation

import sys


class Graph():

	def __init__(self, vertices):

		self.V = vertices
		self.graph = [[0 for col in range(vertices)] for row in range(vertices)]

	def print_solution(self, dist):

		print("Vertex \tDistance from Source")
		for node in range(self.V):
			print(node, "\t", dist[node])

	def min_distance(self, dist, sset):

		# minimum distance for next node
		min_ = sys.maxsize

		# search not nearest vertex not in the shortest path tree
		for u in range(self.V):
			if dist[u] < min_ and sset[u] == False:
				min_ = dist[u]
				min_index = u

		return min_index


	def dijkstra(self, src):

		dist = [sys.maxsize] * self.V
		dist[src] = 0
		sset = [False] * self.V

		for c in range(self.V):
			x = self.min_distance(dist, sset)
			sset[x] = True

			for y in range(self.V):
				if self.graph[x][y] > 0 and \
                   sset[y] == False and \
                   dist[y] > dist[x] + self.graph[x][y]:
					    dist[y] = dist[x] + self.graph[x][y]

		self.print_solution(dist)


if __name__ == "__main__":
	g = Graph(9)
	g.graph = [     [0, 4, 0, 0, 0, 0, 0, 8, 0],
			        [4, 0, 8, 0, 0, 0, 0, 11, 0],
			        [0, 8, 0, 7, 0, 4, 0, 0, 2],
			        [0, 0, 7, 0, 9, 14, 0, 0, 0],
			        [0, 0, 0, 9, 0, 10, 0, 0, 0],
			        [0, 0, 4, 14, 10, 0, 2, 0, 0],
			        [0, 0, 0, 0, 0, 2, 0, 1, 6],
			        [8, 11, 0, 0, 0, 0, 1, 0, 7],
			        [0, 0, 2, 0, 0, 0, 6, 7, 0]
			]

	g.dijkstra(0)