feat: ✨ Upload Notebook
This commit is contained in:
		
							
								
								
									
										446
									
								
								debug.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										446
									
								
								debug.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,446 @@ | |||||||
|  | import queue | ||||||
|  |  | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | """Graph module. | ||||||
|  |  | ||||||
|  | Provide an implementation of graphs with adjacency lists. | ||||||
|  |  | ||||||
|  | In a graph, vertices are considered numbered from 0 to the order of the graph | ||||||
|  | minus one. The vertex key can then be used to access its | ||||||
|  | adjacency list. | ||||||
|  |  | ||||||
|  | """ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class Graph: | ||||||
|  |     """ Simple class for graph: adjacency lists | ||||||
|  |  | ||||||
|  |     Attributes: | ||||||
|  |         order (int): Number of vertices. | ||||||
|  |         directed (bool): True if the graph is directed. False otherwise. | ||||||
|  |         adjlists (List[List[int]]): Lists of connected vertices for each vertex. | ||||||
|  |  | ||||||
|  |     """ | ||||||
|  |  | ||||||
|  |     def __init__(self, order, directed, labels=None): | ||||||
|  |         """Init graph, allocate adjacency lists | ||||||
|  |  | ||||||
|  |         Args: | ||||||
|  |             order (int): Number of nodes. | ||||||
|  |             directed (bool): True if the graph is directed. False otherwise. | ||||||
|  |             labels (list[str]): optionnal vector of vertex labels | ||||||
|  |         """ | ||||||
|  |  | ||||||
|  |         self.order = order | ||||||
|  |         self.directed = directed | ||||||
|  |         self.adjlists = [] | ||||||
|  |         for _ in range(order): | ||||||
|  |             self.adjlists.append([]) | ||||||
|  |         self.labels = labels | ||||||
|  |  | ||||||
|  |     def addedge(self, src, dst): | ||||||
|  |         """Add egde to graph. | ||||||
|  |  | ||||||
|  |         Args: | ||||||
|  |             src (int): Source vertex. | ||||||
|  |             dst (int): Destination vertex. | ||||||
|  |  | ||||||
|  |         Raises: | ||||||
|  |             IndexError: If any vertex index is invalid. | ||||||
|  |  | ||||||
|  |         """ | ||||||
|  |         if src >= self.order or src < 0: | ||||||
|  |             raise IndexError("Invalid src index") | ||||||
|  |         if dst >= self.order or dst < 0: | ||||||
|  |             raise IndexError("Invalid dst index") | ||||||
|  |  | ||||||
|  |         self.adjlists[src].append(dst) | ||||||
|  |         if not self.directed and dst != src: | ||||||
|  |             self.adjlists[dst].append(src) | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     def addvertex(self, number=1, labels=None): | ||||||
|  |         """Add number vertices to graph. | ||||||
|  |  | ||||||
|  |         Args: | ||||||
|  |             ref (Graph). | ||||||
|  |             number (int): Number of vertices to add. | ||||||
|  |  | ||||||
|  |         """ | ||||||
|  |  | ||||||
|  |         # Increment order and extend adjacency list | ||||||
|  |         self.order += number | ||||||
|  |         for _ in range(number): | ||||||
|  |             self.adjlists.append([]) | ||||||
|  |         if labels: | ||||||
|  |             self.labels += labels | ||||||
|  |  | ||||||
|  |     def removeedge(self, src, dst): | ||||||
|  |         """Remove egde from the graph. | ||||||
|  |  | ||||||
|  |         Args: | ||||||
|  |             src (int): Source vertex. | ||||||
|  |             dst (int): Destination vertex. | ||||||
|  |  | ||||||
|  |         Raises: | ||||||
|  |             IndexError: If any vertex index is invalid. | ||||||
|  |  | ||||||
|  |         """ | ||||||
|  |  | ||||||
|  |         if src >= self.order or src < 0: | ||||||
|  |             raise IndexError("Invalid src index") | ||||||
|  |         if dst >= self.order or dst < 0: | ||||||
|  |             raise IndexError("Invalid dst index") | ||||||
|  |         if dst in self.adjlists[src]: | ||||||
|  |             self.adjlists[src].remove(dst) | ||||||
|  |             if not self.directed and dst != src: | ||||||
|  |                 self.adjlists[dst].remove(src) | ||||||
|  |  | ||||||
|  | def sortgraph(G): | ||||||
|  |     """ | ||||||
|  |     sorts adjacency lists -> to have same results as those asked in tutorials/exams | ||||||
|  |     """ | ||||||
|  |     for i in range(G.order): | ||||||
|  |         G.adjlists[i].sort() | ||||||
|  |  | ||||||
|  | def dot(G): | ||||||
|  |     """Dot format of graph. | ||||||
|  |  | ||||||
|  |     Args: | ||||||
|  |         Graph | ||||||
|  |  | ||||||
|  |     Returns: | ||||||
|  |         str: String storing dot format of graph. | ||||||
|  |  | ||||||
|  |     """ | ||||||
|  |  | ||||||
|  |     if G.directed: | ||||||
|  |         s = "digraph {\n" | ||||||
|  |         for x in range(G.order): | ||||||
|  |             if G.labels: | ||||||
|  |                 s += "  " + str(x) + '[label = "' + G.labels[x] + '"]\n' | ||||||
|  |             else: | ||||||
|  |                 s += "  " + str(x) + '\n' | ||||||
|  |             for y in G.adjlists[x]: | ||||||
|  |                 s += str(x) + " -> " + str(y) + '\n' | ||||||
|  |     else: | ||||||
|  |         s = "graph {\n" | ||||||
|  |         for x in range(G.order): | ||||||
|  |             if G.labels: | ||||||
|  |                 s += "  " + str(x) + '[label = "' + G.labels[x] + '"]\n' | ||||||
|  |             else: | ||||||
|  |                 s += "  " + str(x) + '\n' | ||||||
|  |             for y in G.adjlists[x]: | ||||||
|  |                 if x <= y: | ||||||
|  |                     s += str(x) + " -- " + str(y) + '\n' | ||||||
|  |     return s + '}' | ||||||
|  |  | ||||||
|  | def display(G, eng=None): | ||||||
|  |     """ | ||||||
|  |     *Warning:* Made for use within IPython/Jupyter only. | ||||||
|  |     eng: graphivz.Source "engine" optional argument (try "neato", "fdp", "sfdp", "circo") | ||||||
|  |  | ||||||
|  |     """ | ||||||
|  |  | ||||||
|  |     try: | ||||||
|  |         from graphviz import Source | ||||||
|  |         from IPython.display import display | ||||||
|  |     except: | ||||||
|  |         raise Exception("Missing module: graphviz and/or IPython.") | ||||||
|  |     display(Source(dot(G), engine = eng)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # load / save gra format | ||||||
|  |  | ||||||
|  | def load(filename): | ||||||
|  |     """Build a new graph from a GRA file. | ||||||
|  |  | ||||||
|  |     Args: | ||||||
|  |         filename (str): File to load. | ||||||
|  |  | ||||||
|  |     Returns: | ||||||
|  |         Graph: New graph. | ||||||
|  |  | ||||||
|  |     Raises: | ||||||
|  |         FileNotFoundError: If file does not exist. | ||||||
|  |  | ||||||
|  |     """ | ||||||
|  |  | ||||||
|  |     f = open(filename) | ||||||
|  |     lines = f.readlines() | ||||||
|  |     f.close() | ||||||
|  |  | ||||||
|  |     infos = {} | ||||||
|  |     i = 0 | ||||||
|  |     while '#' in lines[i]: | ||||||
|  |         (key, val) = lines[i][1:].strip().split(": ") | ||||||
|  |         infos[key] = val | ||||||
|  |         i += 1 | ||||||
|  |  | ||||||
|  |     directed = bool(int(lines[i])) | ||||||
|  |     order = int(lines[i+1]) | ||||||
|  |  | ||||||
|  |     if infos and "labels" in infos: | ||||||
|  |         labels = infos["labels"].split(',') #labels is a list of str | ||||||
|  |         G = Graph(order, directed, labels)  # a graph with labels | ||||||
|  |     else: | ||||||
|  |         G = Graph(order, directed)  # a graph without labels | ||||||
|  |     if infos: | ||||||
|  |         G.infos = infos | ||||||
|  |  | ||||||
|  |     for line in lines[i+2:]: | ||||||
|  |         edge = line.strip().split(' ') | ||||||
|  |         (src, dst) = (int(edge[0]), int(edge[1])) | ||||||
|  |         G.addedge(src, dst) | ||||||
|  |     return G | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def save(G, fileOut): | ||||||
|  |     gra = "" | ||||||
|  |     if G.labels: | ||||||
|  |         lab = "#labels: " | ||||||
|  |         for i in range(G.order - 1): | ||||||
|  |             lab += G.labels[i] + ',' | ||||||
|  |         lab += G.labels[-1] | ||||||
|  |         gra += lab + '\n' | ||||||
|  |     gra += str(int(G.directed)) + '\n' | ||||||
|  |     gra += str(G.order) + '\n' | ||||||
|  |     for x in range(G.order): | ||||||
|  |         for y in G.adjlists[x]: | ||||||
|  |             if G.directed or x >= y: | ||||||
|  |                 gra += str(x) + " " + str(y) + '\n' | ||||||
|  |     fout = open(fileOut, mode='w') | ||||||
|  |     fout.write(gra) | ||||||
|  |     fout.close() | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | """Graph module. | ||||||
|  |  | ||||||
|  | Provide an implementation of graphs with adjacency matrix. | ||||||
|  | This can also be called static implementation. | ||||||
|  |  | ||||||
|  | In a graph, vertices are considered numbered from 0 to the order of the graph | ||||||
|  | minus one. | ||||||
|  |  | ||||||
|  | """ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class GraphMat: | ||||||
|  |     """ Simple class for static graph. | ||||||
|  |  | ||||||
|  |     Attributes: | ||||||
|  |         order (int): Number of vertices. | ||||||
|  |         directed (bool): True if the graph is directed. False otherwise. | ||||||
|  |         adj (List[List[int]]): Adjacency matrix | ||||||
|  |     """ | ||||||
|  |  | ||||||
|  |     def __init__(self, order, directed): | ||||||
|  |         """ | ||||||
|  |         Args: | ||||||
|  |             order (int): Number of nodes. | ||||||
|  |             directed (bool): True if the graph is directed. False otherwise. | ||||||
|  |         """ | ||||||
|  |  | ||||||
|  |         self.order = order | ||||||
|  |         self.directed = directed | ||||||
|  |         self.adj = [[0 for j in range(order)] for i in range(order)] | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     def addedge(self, src, dst): | ||||||
|  |         """Add egde to graph. | ||||||
|  |  | ||||||
|  |         Args: | ||||||
|  |             src (int): Source vertex. | ||||||
|  |             dst (int): Destination vertex. | ||||||
|  |  | ||||||
|  |         Raises: | ||||||
|  |             IndexError: If any vertex index is invalid. | ||||||
|  |  | ||||||
|  |         """ | ||||||
|  |  | ||||||
|  |         if src >= self.order or src < 0: | ||||||
|  |             raise IndexError("Invalid src index") | ||||||
|  |         if dst >= self.order or dst < 0: | ||||||
|  |             raise IndexError("Invalid dst index") | ||||||
|  |  | ||||||
|  |         self.adj[src][dst] += 1 | ||||||
|  |         if not self.directed and dst != src: | ||||||
|  |             self.adj[dst][src] += 1 | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def dot(G): | ||||||
|  |     """Dot format of graph. | ||||||
|  |  | ||||||
|  |     Args: | ||||||
|  |         GraphMat | ||||||
|  |  | ||||||
|  |     Returns: | ||||||
|  |         str: String storing dot format of graph. | ||||||
|  |  | ||||||
|  |     """ | ||||||
|  |  | ||||||
|  |     if G.directed: | ||||||
|  |         s = "digraph {\n" | ||||||
|  |         link = " -> " | ||||||
|  |         for x in range(G.order): | ||||||
|  |             for y in range(G.order): | ||||||
|  |                 s += (str(x) + link + str(y) + '\n') * G.adj[x][y] | ||||||
|  |     else: | ||||||
|  |         s = "graph {\n" | ||||||
|  |         link = " -- " | ||||||
|  |         for x in range(G.order): | ||||||
|  |             for y in range(x+1): | ||||||
|  |                 s += (str(x) + link + str(y) + '\n') * G.adj[x][y] | ||||||
|  |     return s + '}' | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def display(G, eng=None): | ||||||
|  |     """ | ||||||
|  |     *Warning:* Made for use within IPython/Jupyter only. | ||||||
|  |     eng: graphivz.Source "engine" optional argument (try "neato", "fdp", "sfdp", "circo") | ||||||
|  |  | ||||||
|  |     """ | ||||||
|  |  | ||||||
|  |     try: | ||||||
|  |         from graphviz import Source | ||||||
|  |         from IPython.display import display | ||||||
|  |     except: | ||||||
|  |         raise Exception("Missing module: graphviz and/or IPython.") | ||||||
|  |     display(Source(dot(G), engine = eng)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # load / save gra format    (do not manage labels and other infos) | ||||||
|  |  | ||||||
|  | def load(filename,): | ||||||
|  |     """Build a new graph from a GRA file. | ||||||
|  |  | ||||||
|  |     Args: | ||||||
|  |         filename (str): File to load. | ||||||
|  |  | ||||||
|  |     Returns: | ||||||
|  |         Graph: New graph. | ||||||
|  |  | ||||||
|  |     Raises: | ||||||
|  |         FileNotFoundError: If file does not exist. | ||||||
|  |  | ||||||
|  |     """ | ||||||
|  |  | ||||||
|  |     f = open(filename) | ||||||
|  |     directed = bool(int(f.readline())) | ||||||
|  |     order = int(f.readline()) | ||||||
|  |     g = GraphMat(order, directed) | ||||||
|  |     for line in f.readlines(): | ||||||
|  |         edge = line.strip().split(' ') | ||||||
|  |         (src, dst) = (int(edge[0]), int(edge[1])) | ||||||
|  |         g.addedge(src, dst) | ||||||
|  |     f.close() | ||||||
|  |     return g | ||||||
|  |  | ||||||
|  | def save(G, fileOut): | ||||||
|  |     gra = str(int(G.directed)) + '\n' | ||||||
|  |     gra += str(G.order) + '\n' | ||||||
|  |     for x in range(G.order): | ||||||
|  |         if G.directed: | ||||||
|  |             n = G.order | ||||||
|  |         else: | ||||||
|  |             n = x + 1 | ||||||
|  |         for y in range(n): | ||||||
|  |             for i in range(G.adj[x][y]): | ||||||
|  |                 gra += str(x) + " " + str(y) + '\n' | ||||||
|  |     fout = open(fileOut, mode='w') | ||||||
|  |     fout.write(gra) | ||||||
|  |     fout.close() | ||||||
|  |  | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | """Queue module.""" | ||||||
|  |  | ||||||
|  | from collections import deque | ||||||
|  |  | ||||||
|  | class Queue: | ||||||
|  |     """Simple class for FIFO (first-in-first-out) container.""" | ||||||
|  |  | ||||||
|  |     def __init__(self): | ||||||
|  |         """Init queue.""" | ||||||
|  |  | ||||||
|  |         self.elements = deque() | ||||||
|  |  | ||||||
|  |     def enqueue(self, elt): | ||||||
|  |         """Add an element to the queue. | ||||||
|  |  | ||||||
|  |         Args: | ||||||
|  |             elt (Any): Element to enqueue. | ||||||
|  |  | ||||||
|  |         """ | ||||||
|  |  | ||||||
|  |         self.elements.append(elt) | ||||||
|  |  | ||||||
|  |     def dequeue(self): | ||||||
|  |         """Remove and return next element from the queue. | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             Any: Element from the queue. | ||||||
|  |  | ||||||
|  |         Raises: | ||||||
|  |             IndexError: If queue is empty. | ||||||
|  |  | ||||||
|  |         """ | ||||||
|  |  | ||||||
|  |         return self.elements.popleft() | ||||||
|  |  | ||||||
|  |     def isempty(self): | ||||||
|  |         """Check whether queue is empty. | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             bool: True if queue is empty, False otherwise. | ||||||
|  |  | ||||||
|  |         """ | ||||||
|  |  | ||||||
|  |         return len(self.elements) == 0 | ||||||
|  |  | ||||||
|  | G = Graph(10, False) | ||||||
|  | G.adjlists = [[4, 4, 1, 3], | ||||||
|  |                [0], | ||||||
|  |                [6, 6, 6, 5, 7], | ||||||
|  |                [0], | ||||||
|  |                [0, 0, 9], | ||||||
|  |                [2, 7, 8], | ||||||
|  |                [2, 2, 2, 7], | ||||||
|  |                [2, 6, 5, 8], | ||||||
|  |                [7, 5, 8], | ||||||
|  |                [4]] | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def __smallest_level(G, M, src, perLevel): | ||||||
|  |     cur = Queue() | ||||||
|  |     cur.enqueue(src) | ||||||
|  |     cur.enqueue(None) | ||||||
|  |     M[src] = True | ||||||
|  |     temp = [] | ||||||
|  |     while not cur.isempty(): | ||||||
|  |         x = cur.dequeue() | ||||||
|  |         if x is None: | ||||||
|  |             if (len(temp) != 0 and temp != [src]): | ||||||
|  |                 perLevel.append(temp) | ||||||
|  |             temp = [] | ||||||
|  |         else: | ||||||
|  |             temp.append(x) | ||||||
|  |             for adj in G.adjlists[x]: | ||||||
|  |                 if not M[adj]: | ||||||
|  |                     M[adj] = True | ||||||
|  |                     cur.enqueue(adj) | ||||||
|  |             cur.enqueue(None) | ||||||
|  | def smallest_level(G, src): | ||||||
|  |     M = [False] * G.order | ||||||
|  |     perLevel = [] | ||||||
|  |     __smallest_level(G, M, src, perLevel) | ||||||
|  |     min = perLevel[0] | ||||||
|  |     for element in perLevel: | ||||||
|  |         if len(element) < len(min): | ||||||
|  |             min = element | ||||||
|  |     return min | ||||||
|  |  | ||||||
|  | smallest_level(G, 0) | ||||||
							
								
								
									
										437
									
								
								graphs.ipynb
									
									
									
									
									
								
							
							
						
						
									
										437
									
								
								graphs.ipynb
									
									
									
									
									
								
							| @ -6,8 +6,8 @@ | |||||||
|    "metadata": { |    "metadata": { | ||||||
|     "collapsed": true, |     "collapsed": true, | ||||||
|     "ExecuteTime": { |     "ExecuteTime": { | ||||||
|      "end_time": "2024-12-14T10:54:32.699159Z", |      "end_time": "2024-12-14T12:23:31.698030Z", | ||||||
|      "start_time": "2024-12-14T10:54:32.688460Z" |      "start_time": "2024-12-14T12:23:31.686929Z" | ||||||
|     } |     } | ||||||
|    }, |    }, | ||||||
|    "source": [ |    "source": [ | ||||||
| @ -227,166 +227,26 @@ | |||||||
|     "    fout.close()\n" |     "    fout.close()\n" | ||||||
|    ], |    ], | ||||||
|    "outputs": [], |    "outputs": [], | ||||||
|    "execution_count": 3 |    "execution_count": 1 | ||||||
|   }, |   }, | ||||||
|   { |   { | ||||||
|    "metadata": { |    "metadata": { | ||||||
|     "ExecuteTime": { |     "ExecuteTime": { | ||||||
|      "end_time": "2024-12-14T10:54:33.640420Z", |      "end_time": "2024-12-14T12:23:31.740543Z", | ||||||
|      "start_time": "2024-12-14T10:54:33.634885Z" |      "start_time": "2024-12-14T12:23:31.738488Z" | ||||||
|     } |     } | ||||||
|    }, |    }, | ||||||
|    "cell_type": "code", |    "cell_type": "code", | ||||||
|    "source": [ |    "source": "", | ||||||
|     "# -*- coding: utf-8 -*-\n", |  | ||||||
|     "\"\"\"Graph module.\n", |  | ||||||
|     "\n", |  | ||||||
|     "Provide an implementation of graphs with adjacency matrix.\n", |  | ||||||
|     "This can also be called static implementation.\n", |  | ||||||
|     "\n", |  | ||||||
|     "In a graph, vertices are considered numbered from 0 to the order of the graph\n", |  | ||||||
|     "minus one.\n", |  | ||||||
|     "\n", |  | ||||||
|     "\"\"\"\n", |  | ||||||
|     "\n", |  | ||||||
|     "\n", |  | ||||||
|     "class GraphMat:\n", |  | ||||||
|     "    \"\"\" Simple class for static graph.\n", |  | ||||||
|     "\n", |  | ||||||
|     "    Attributes:\n", |  | ||||||
|     "        order (int): Number of vertices.\n", |  | ||||||
|     "        directed (bool): True if the graph is directed. False otherwise.\n", |  | ||||||
|     "        adj (List[List[int]]): Adjacency matrix\n", |  | ||||||
|     "    \"\"\"\n", |  | ||||||
|     "\n", |  | ||||||
|     "    def __init__(self, order, directed):\n", |  | ||||||
|     "        \"\"\"\n", |  | ||||||
|     "        Args:\n", |  | ||||||
|     "            order (int): Number of nodes.\n", |  | ||||||
|     "            directed (bool): True if the graph is directed. False otherwise.\n", |  | ||||||
|     "        \"\"\"\n", |  | ||||||
|     "\n", |  | ||||||
|     "        self.order = order\n", |  | ||||||
|     "        self.directed = directed\n", |  | ||||||
|     "        self.adj = [[0 for j in range(order)] for i in range(order)]\n", |  | ||||||
|     "\n", |  | ||||||
|     "\n", |  | ||||||
|     "    def addedge(self, src, dst):\n", |  | ||||||
|     "        \"\"\"Add egde to graph.\n", |  | ||||||
|     "\n", |  | ||||||
|     "        Args:\n", |  | ||||||
|     "            src (int): Source vertex.\n", |  | ||||||
|     "            dst (int): Destination vertex.\n", |  | ||||||
|     "\n", |  | ||||||
|     "        Raises:\n", |  | ||||||
|     "            IndexError: If any vertex index is invalid.\n", |  | ||||||
|     "\n", |  | ||||||
|     "        \"\"\"\n", |  | ||||||
|     "\n", |  | ||||||
|     "        if src >= self.order or src < 0:\n", |  | ||||||
|     "            raise IndexError(\"Invalid src index\")\n", |  | ||||||
|     "        if dst >= self.order or dst < 0:\n", |  | ||||||
|     "            raise IndexError(\"Invalid dst index\")\n", |  | ||||||
|     "\n", |  | ||||||
|     "        self.adj[src][dst] += 1\n", |  | ||||||
|     "        if not self.directed and dst != src:\n", |  | ||||||
|     "            self.adj[dst][src] += 1\n", |  | ||||||
|     "\n", |  | ||||||
|     "\n", |  | ||||||
|     "\n", |  | ||||||
|     "def dot(G):\n", |  | ||||||
|     "    \"\"\"Dot format of graph.\n", |  | ||||||
|     "\n", |  | ||||||
|     "    Args:\n", |  | ||||||
|     "        GraphMat\n", |  | ||||||
|     "\n", |  | ||||||
|     "    Returns:\n", |  | ||||||
|     "        str: String storing dot format of graph.\n", |  | ||||||
|     "\n", |  | ||||||
|     "    \"\"\"\n", |  | ||||||
|     "\n", |  | ||||||
|     "    if G.directed:\n", |  | ||||||
|     "        s = \"digraph {\\n\"\n", |  | ||||||
|     "        link = \" -> \"\n", |  | ||||||
|     "        for x in range(G.order):\n", |  | ||||||
|     "            for y in range(G.order):\n", |  | ||||||
|     "                s += (str(x) + link + str(y) + '\\n') * G.adj[x][y]\n", |  | ||||||
|     "    else:\n", |  | ||||||
|     "        s = \"graph {\\n\"\n", |  | ||||||
|     "        link = \" -- \"\n", |  | ||||||
|     "        for x in range(G.order):\n", |  | ||||||
|     "            for y in range(x+1):\n", |  | ||||||
|     "                s += (str(x) + link + str(y) + '\\n') * G.adj[x][y]\n", |  | ||||||
|     "    return s + '}'\n", |  | ||||||
|     "\n", |  | ||||||
|     "\n", |  | ||||||
|     "\n", |  | ||||||
|     "def display(G, eng=None):\n", |  | ||||||
|     "    \"\"\"\n", |  | ||||||
|     "    *Warning:* Made for use within IPython/Jupyter only.\n", |  | ||||||
|     "    eng: graphivz.Source \"engine\" optional argument (try \"neato\", \"fdp\", \"sfdp\", \"circo\")\n", |  | ||||||
|     "\n", |  | ||||||
|     "    \"\"\"\n", |  | ||||||
|     "\n", |  | ||||||
|     "    try:\n", |  | ||||||
|     "        from graphviz import Source\n", |  | ||||||
|     "        from IPython.display import display\n", |  | ||||||
|     "    except:\n", |  | ||||||
|     "        raise Exception(\"Missing module: graphviz and/or IPython.\")\n", |  | ||||||
|     "    display(Source(dot(G), engine = eng))\n", |  | ||||||
|     "\n", |  | ||||||
|     "\n", |  | ||||||
|     "# load / save gra format    (do not manage labels and other infos)\n", |  | ||||||
|     "\n", |  | ||||||
|     "def load(filename,):\n", |  | ||||||
|     "    \"\"\"Build a new graph from a GRA file.\n", |  | ||||||
|     "\n", |  | ||||||
|     "    Args:\n", |  | ||||||
|     "        filename (str): File to load.\n", |  | ||||||
|     "\n", |  | ||||||
|     "    Returns:\n", |  | ||||||
|     "        Graph: New graph.\n", |  | ||||||
|     "\n", |  | ||||||
|     "    Raises:\n", |  | ||||||
|     "        FileNotFoundError: If file does not exist.\n", |  | ||||||
|     "\n", |  | ||||||
|     "    \"\"\"\n", |  | ||||||
|     "\n", |  | ||||||
|     "    f = open(filename)\n", |  | ||||||
|     "    directed = bool(int(f.readline()))\n", |  | ||||||
|     "    order = int(f.readline())\n", |  | ||||||
|     "    g = GraphMat(order, directed)\n", |  | ||||||
|     "    for line in f.readlines():\n", |  | ||||||
|     "        edge = line.strip().split(' ')\n", |  | ||||||
|     "        (src, dst) = (int(edge[0]), int(edge[1]))\n", |  | ||||||
|     "        g.addedge(src, dst)\n", |  | ||||||
|     "    f.close()\n", |  | ||||||
|     "    return g\n", |  | ||||||
|     "\n", |  | ||||||
|     "def save(G, fileOut):\n", |  | ||||||
|     "    gra = str(int(G.directed)) + '\\n'\n", |  | ||||||
|     "    gra += str(G.order) + '\\n'\n", |  | ||||||
|     "    for x in range(G.order):\n", |  | ||||||
|     "        if G.directed:\n", |  | ||||||
|     "            n = G.order\n", |  | ||||||
|     "        else:\n", |  | ||||||
|     "            n = x + 1\n", |  | ||||||
|     "        for y in range(n):\n", |  | ||||||
|     "            for i in range(G.adj[x][y]):\n", |  | ||||||
|     "                gra += str(x) + \" \" + str(y) + '\\n'\n", |  | ||||||
|     "    fout = open(fileOut, mode='w')\n", |  | ||||||
|     "    fout.write(gra)\n", |  | ||||||
|     "    fout.close()\n" |  | ||||||
|    ], |  | ||||||
|    "id": "e12f5903c5348752", |    "id": "e12f5903c5348752", | ||||||
|    "outputs": [], |    "outputs": [], | ||||||
|    "execution_count": 4 |    "execution_count": null | ||||||
|   }, |   }, | ||||||
|   { |   { | ||||||
|    "metadata": { |    "metadata": { | ||||||
|     "ExecuteTime": { |     "ExecuteTime": { | ||||||
|      "end_time": "2024-12-14T10:54:34.476061Z", |      "end_time": "2024-12-14T12:23:31.807702Z", | ||||||
|      "start_time": "2024-12-14T10:54:34.472348Z" |      "start_time": "2024-12-14T12:23:31.804575Z" | ||||||
|     } |     } | ||||||
|    }, |    }, | ||||||
|    "cell_type": "code", |    "cell_type": "code", | ||||||
| @ -439,7 +299,7 @@ | |||||||
|    ], |    ], | ||||||
|    "id": "663b49e4f6763d11", |    "id": "663b49e4f6763d11", | ||||||
|    "outputs": [], |    "outputs": [], | ||||||
|    "execution_count": 5 |    "execution_count": 2 | ||||||
|   }, |   }, | ||||||
|   { |   { | ||||||
|    "metadata": {}, |    "metadata": {}, | ||||||
| @ -450,8 +310,8 @@ | |||||||
|   { |   { | ||||||
|    "metadata": { |    "metadata": { | ||||||
|     "ExecuteTime": { |     "ExecuteTime": { | ||||||
|      "end_time": "2024-12-14T10:54:38.976275Z", |      "end_time": "2024-12-14T12:23:31.826260Z", | ||||||
|      "start_time": "2024-12-14T10:54:38.973873Z" |      "start_time": "2024-12-14T12:23:31.824156Z" | ||||||
|     } |     } | ||||||
|    }, |    }, | ||||||
|    "cell_type": "code", |    "cell_type": "code", | ||||||
| @ -471,13 +331,13 @@ | |||||||
|    ], |    ], | ||||||
|    "id": "ca54f5a3f1a225b", |    "id": "ca54f5a3f1a225b", | ||||||
|    "outputs": [], |    "outputs": [], | ||||||
|    "execution_count": 6 |    "execution_count": 3 | ||||||
|   }, |   }, | ||||||
|   { |   { | ||||||
|    "metadata": { |    "metadata": { | ||||||
|     "ExecuteTime": { |     "ExecuteTime": { | ||||||
|      "end_time": "2024-12-14T10:54:39.957846Z", |      "end_time": "2024-12-14T12:23:31.853995Z", | ||||||
|      "start_time": "2024-12-14T10:54:39.955269Z" |      "start_time": "2024-12-14T12:23:31.851762Z" | ||||||
|     } |     } | ||||||
|    }, |    }, | ||||||
|    "cell_type": "code", |    "cell_type": "code", | ||||||
| @ -498,7 +358,7 @@ | |||||||
|      ] |      ] | ||||||
|     } |     } | ||||||
|    ], |    ], | ||||||
|    "execution_count": 7 |    "execution_count": 4 | ||||||
|   }, |   }, | ||||||
|   { |   { | ||||||
|    "metadata": {}, |    "metadata": {}, | ||||||
| @ -509,8 +369,8 @@ | |||||||
|   { |   { | ||||||
|    "metadata": { |    "metadata": { | ||||||
|     "ExecuteTime": { |     "ExecuteTime": { | ||||||
|      "end_time": "2024-12-14T10:54:41.253023Z", |      "end_time": "2024-12-14T12:23:31.886996Z", | ||||||
|      "start_time": "2024-12-14T10:54:41.250277Z" |      "start_time": "2024-12-14T12:23:31.884644Z" | ||||||
|     } |     } | ||||||
|    }, |    }, | ||||||
|    "cell_type": "code", |    "cell_type": "code", | ||||||
| @ -528,7 +388,7 @@ | |||||||
|    ], |    ], | ||||||
|    "id": "6920c423c0bdfc24", |    "id": "6920c423c0bdfc24", | ||||||
|    "outputs": [], |    "outputs": [], | ||||||
|    "execution_count": 8 |    "execution_count": 5 | ||||||
|   }, |   }, | ||||||
|   { |   { | ||||||
|    "metadata": {}, |    "metadata": {}, | ||||||
| @ -539,8 +399,8 @@ | |||||||
|   { |   { | ||||||
|    "metadata": { |    "metadata": { | ||||||
|     "ExecuteTime": { |     "ExecuteTime": { | ||||||
|      "end_time": "2024-12-09T14:48:04.596974Z", |      "end_time": "2024-12-14T12:23:31.913924Z", | ||||||
|      "start_time": "2024-12-09T14:48:04.592782Z" |      "start_time": "2024-12-14T12:23:31.909906Z" | ||||||
|     } |     } | ||||||
|    }, |    }, | ||||||
|    "cell_type": "code", |    "cell_type": "code", | ||||||
| @ -561,18 +421,18 @@ | |||||||
|        "[4, 1, 5, 1, 3, 3, 4, 4, 3, 1]" |        "[4, 1, 5, 1, 3, 3, 4, 4, 3, 1]" | ||||||
|       ] |       ] | ||||||
|      }, |      }, | ||||||
|      "execution_count": 8, |      "execution_count": 6, | ||||||
|      "metadata": {}, |      "metadata": {}, | ||||||
|      "output_type": "execute_result" |      "output_type": "execute_result" | ||||||
|     } |     } | ||||||
|    ], |    ], | ||||||
|    "execution_count": 8 |    "execution_count": 6 | ||||||
|   }, |   }, | ||||||
|   { |   { | ||||||
|    "metadata": { |    "metadata": { | ||||||
|     "ExecuteTime": { |     "ExecuteTime": { | ||||||
|      "end_time": "2024-12-09T14:48:05.120730Z", |      "end_time": "2024-12-14T12:23:31.946802Z", | ||||||
|      "start_time": "2024-12-09T14:48:05.116518Z" |      "start_time": "2024-12-14T12:23:31.943693Z" | ||||||
|     } |     } | ||||||
|    }, |    }, | ||||||
|    "cell_type": "code", |    "cell_type": "code", | ||||||
| @ -596,12 +456,12 @@ | |||||||
|        "[[3, 4, 1, 2, 3, 2, 3, 0, 2], [6, 1, 1, 2, 0, 3, 2, 3, 2]]" |        "[[3, 4, 1, 2, 3, 2, 3, 0, 2], [6, 1, 1, 2, 0, 3, 2, 3, 2]]" | ||||||
|       ] |       ] | ||||||
|      }, |      }, | ||||||
|      "execution_count": 9, |      "execution_count": 7, | ||||||
|      "metadata": {}, |      "metadata": {}, | ||||||
|      "output_type": "execute_result" |      "output_type": "execute_result" | ||||||
|     } |     } | ||||||
|    ], |    ], | ||||||
|    "execution_count": 9 |    "execution_count": 7 | ||||||
|   }, |   }, | ||||||
|   { |   { | ||||||
|    "metadata": {}, |    "metadata": {}, | ||||||
| @ -612,8 +472,8 @@ | |||||||
|   { |   { | ||||||
|    "metadata": { |    "metadata": { | ||||||
|     "ExecuteTime": { |     "ExecuteTime": { | ||||||
|      "end_time": "2024-12-09T14:48:06.156919Z", |      "end_time": "2024-12-14T12:23:32.018541Z", | ||||||
|      "start_time": "2024-12-09T14:48:06.154020Z" |      "start_time": "2024-12-14T12:23:32.015799Z" | ||||||
|     } |     } | ||||||
|    }, |    }, | ||||||
|    "cell_type": "code", |    "cell_type": "code", | ||||||
| @ -696,7 +556,7 @@ | |||||||
|      ] |      ] | ||||||
|     } |     } | ||||||
|    ], |    ], | ||||||
|    "execution_count": 10 |    "execution_count": 8 | ||||||
|   }, |   }, | ||||||
|   { |   { | ||||||
|    "metadata": {}, |    "metadata": {}, | ||||||
| @ -910,21 +770,21 @@ | |||||||
|   { |   { | ||||||
|    "metadata": { |    "metadata": { | ||||||
|     "ExecuteTime": { |     "ExecuteTime": { | ||||||
|      "end_time": "2024-12-09T15:48:15.121203Z", |      "end_time": "2024-12-14T12:50:54.278706Z", | ||||||
|      "start_time": "2024-12-09T15:48:15.116918Z" |      "start_time": "2024-12-14T12:50:54.271435Z" | ||||||
|     } |     } | ||||||
|    }, |    }, | ||||||
|    "cell_type": "code", |    "cell_type": "code", | ||||||
|    "source": [ |    "source": [ | ||||||
|     "def aux(G, M, src):\n", |     "def aux_colors(G, M, src):\n", | ||||||
|     "    newColor = not M[src]\n", |     "    new_color = not M[src]\n", | ||||||
|     "    for adj in G.adjlists[src]:\n", |     "    for adj in G.adjlists[src]:\n", | ||||||
|     "        if M[adj] == None:\n", |     "        if M[adj] == None:\n", | ||||||
|     "            M[adj] = newColor\n", |     "            M[adj] = new_color\n", | ||||||
|     "            if not aux(G, M, adj):\n", |     "            if not aux_colors(G, M, adj):\n", | ||||||
|     "                return False\n", |     "                return False\n", | ||||||
|     "        else:\n", |     "        else:\n", | ||||||
|     "            if M[adj] != newColor:\n", |     "            if M[adj] != new_color:\n", | ||||||
|     "                return False\n", |     "                return False\n", | ||||||
|     "    return True\n", |     "    return True\n", | ||||||
|     "\n", |     "\n", | ||||||
| @ -934,7 +794,7 @@ | |||||||
|     "    for src in range(G.order):\n", |     "    for src in range(G.order):\n", | ||||||
|     "        if M[src] == None:\n", |     "        if M[src] == None:\n", | ||||||
|     "            M[src] = True\n", |     "            M[src] = True\n", | ||||||
|     "        if not aux(G, M, src):\n", |     "            if not aux_colors(G, M, src):\n", | ||||||
|     "                return False\n", |     "                return False\n", | ||||||
|     "    return True\n", |     "    return True\n", | ||||||
|     "\n", |     "\n", | ||||||
| @ -948,12 +808,12 @@ | |||||||
|        "False" |        "False" | ||||||
|       ] |       ] | ||||||
|      }, |      }, | ||||||
|      "execution_count": 32, |      "execution_count": 26, | ||||||
|      "metadata": {}, |      "metadata": {}, | ||||||
|      "output_type": "execute_result" |      "output_type": "execute_result" | ||||||
|     } |     } | ||||||
|    ], |    ], | ||||||
|    "execution_count": 32 |    "execution_count": 26 | ||||||
|   }, |   }, | ||||||
|   { |   { | ||||||
|    "metadata": {}, |    "metadata": {}, | ||||||
| @ -970,31 +830,29 @@ | |||||||
|    }, |    }, | ||||||
|    "cell_type": "code", |    "cell_type": "code", | ||||||
|    "source": [ |    "source": [ | ||||||
|     "def __fakenews(G, M, src, truth):\n", |     "def __fakenews(G, M, src, fake):\n", | ||||||
|     "    cur = Queue()\n", |     "    q = Queue()\n", | ||||||
|     "    cur.enqueue(src)\n", |     "    q.enqueue(src)\n", | ||||||
|     "    stop = False\n", |     "    stop = False\n", | ||||||
|     "    while not cur.isempty() and not stop:\n", |     "    while not q.isempty() and not stop:\n", | ||||||
|     "        x = cur.dequeue()\n", |     "        x = q.dequeue()\n", | ||||||
|     "        if M[x] > truth + 1:\n", |     "        if M[x] > fake:\n", | ||||||
|     "            for adj in G.adjlists[x]:\n", |     "            for adj in G.adjlists[x]:\n", | ||||||
|     "                if M[adj] == None:\n", |     "                if M[adj] == None:\n", | ||||||
|     "                    M[adj] = M[x] - 1\n", |     "                    M[adj] = M[x] - 1\n", | ||||||
|     "                    cur.enqueue(adj)\n", |     "                    q.enqueue(adj)\n", | ||||||
|     "        else:\n", |     "        else:\n", | ||||||
|     "            stop = True\n", |     "            stop = True\n", | ||||||
|     "\n", |     "\n", | ||||||
|     "def fakenews(G, src, truth):\n", |     "def fakenews(G, src, truth):\n", | ||||||
|     "    if (truth <= 2):\n", |     "    M = [None] * G.order\n", | ||||||
|     "        raise Exception(\"truth should be > 2\")\n", |  | ||||||
|     "    M = [False] * G.order\n", |  | ||||||
|     "    M[src] = truth\n", |     "    M[src] = truth\n", | ||||||
|     "    fake = []\n", |     "    __fakenews(G, M, src, truth//2)\n", | ||||||
|     "    __fakenews(G, M, src, truth // 2)\n", |     "    L = []\n", | ||||||
|     "    for i in range(G.order):\n", |     "    for s in range(G.order):\n", | ||||||
|     "        if M[i] == None:\n", |     "        if M[s] == None:\n", | ||||||
|     "            fake.append(i)\n", |     "            L.append(s)\n", | ||||||
|     "    return truth" |     "    return L" | ||||||
|    ], |    ], | ||||||
|    "id": "c66ac4688a6975c9", |    "id": "c66ac4688a6975c9", | ||||||
|    "outputs": [], |    "outputs": [], | ||||||
| @ -1003,24 +861,191 @@ | |||||||
|   { |   { | ||||||
|    "metadata": {}, |    "metadata": {}, | ||||||
|    "cell_type": "markdown", |    "cell_type": "markdown", | ||||||
|    "source": "# 2027 - Exercice 1", |    "source": "# 2027 - Exercice 2", | ||||||
|    "id": "b8fa23568b4bd3df" |    "id": "b8fa23568b4bd3df" | ||||||
|   }, |   }, | ||||||
|   { |   { | ||||||
|    "metadata": {}, |    "metadata": { | ||||||
|  |     "ExecuteTime": { | ||||||
|  |      "end_time": "2024-12-14T12:27:17.971319Z", | ||||||
|  |      "start_time": "2024-12-14T12:27:17.967991Z" | ||||||
|  |     } | ||||||
|  |    }, | ||||||
|    "cell_type": "code", |    "cell_type": "code", | ||||||
|    "outputs": [], |  | ||||||
|    "execution_count": null, |  | ||||||
|    "source": [ |    "source": [ | ||||||
|     "def __longest_path(G, dist, src):\n", |     "# Reconstitution du graph du partiel\n", | ||||||
|  |     "# Initialisation d'un graphe non orienté avec 10 sommets\n", | ||||||
|  |     "G = Graph(order=10, directed=False)\n", | ||||||
|     "\n", |     "\n", | ||||||
|  |     "# Ajout des arêtes selon l'image fournie\n", | ||||||
|  |     "G.addedge(0, 1)\n", | ||||||
|  |     "G.addedge(0, 2)\n", | ||||||
|  |     "G.addedge(0, 8)\n", | ||||||
|  |     "G.addedge(0, 6)\n", | ||||||
|  |     "G.addedge(1, 2)\n", | ||||||
|  |     "G.addedge(1, 3)\n", | ||||||
|  |     "G.addedge(2, 3)\n", | ||||||
|  |     "G.addedge(2, 8)\n", | ||||||
|  |     "G.addedge(3, 5)\n", | ||||||
|  |     "G.addedge(3, 6)\n", | ||||||
|  |     "G.addedge(4, 5)\n", | ||||||
|  |     "G.addedge(5, 7)\n", | ||||||
|  |     "G.addedge(6, 9)\n", | ||||||
|  |     "G.addedge(7, 9)\n", | ||||||
|  |     "G.addedge(8, 9)\n", | ||||||
|     "\n", |     "\n", | ||||||
|     "def longest_path(G):\n", |     "# Tri des listes d'adjacence pour une sortie cohérente\n", | ||||||
|     "    dist = [None] * G.order\n", |     "sortgraph(G)\n", | ||||||
|     "    for src in range(G.order):\n", |     "\n", | ||||||
|     "        __longest_path(G, dist, src)" |     "# Affichage du graphe au format DOT (si tu as graphviz configuré)\n", | ||||||
|  |     "print(dot(G))\n", | ||||||
|  |     "\n", | ||||||
|  |     "# Affichage visuel dans Jupyter Notebook (optionnel)\n", | ||||||
|  |     "# display(G, eng=\"neato\")  # Utilise l'option \"neato\" pour une disposition automatique" | ||||||
|    ], |    ], | ||||||
|    "id": "9a3a85d15dccbb97" |    "id": "f3f003f5ecd72f9e", | ||||||
|  |    "outputs": [ | ||||||
|  |     { | ||||||
|  |      "name": "stdout", | ||||||
|  |      "output_type": "stream", | ||||||
|  |      "text": [ | ||||||
|  |       "digraph {\n", | ||||||
|  |       "0 -- 1\n", | ||||||
|  |       "0 -- 2\n", | ||||||
|  |       "0 -- 6\n", | ||||||
|  |       "0 -- 8\n", | ||||||
|  |       "1 -- 0\n", | ||||||
|  |       "1 -- 2\n", | ||||||
|  |       "1 -- 3\n", | ||||||
|  |       "2 -- 0\n", | ||||||
|  |       "2 -- 1\n", | ||||||
|  |       "2 -- 3\n", | ||||||
|  |       "2 -- 8\n", | ||||||
|  |       "3 -- 1\n", | ||||||
|  |       "3 -- 2\n", | ||||||
|  |       "3 -- 5\n", | ||||||
|  |       "3 -- 6\n", | ||||||
|  |       "4 -- 5\n", | ||||||
|  |       "5 -- 3\n", | ||||||
|  |       "5 -- 4\n", | ||||||
|  |       "5 -- 7\n", | ||||||
|  |       "6 -- 0\n", | ||||||
|  |       "6 -- 3\n", | ||||||
|  |       "6 -- 9\n", | ||||||
|  |       "7 -- 5\n", | ||||||
|  |       "7 -- 9\n", | ||||||
|  |       "8 -- 0\n", | ||||||
|  |       "8 -- 2\n", | ||||||
|  |       "8 -- 9\n", | ||||||
|  |       "9 -- 6\n", | ||||||
|  |       "9 -- 7\n", | ||||||
|  |       "9 -- 8\n", | ||||||
|  |       "}\n" | ||||||
|  |      ] | ||||||
|  |     } | ||||||
|  |    ], | ||||||
|  |    "execution_count": 15 | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |    "metadata": { | ||||||
|  |     "ExecuteTime": { | ||||||
|  |      "end_time": "2024-12-14T12:42:59.642392Z", | ||||||
|  |      "start_time": "2024-12-14T12:42:59.636696Z" | ||||||
|  |     } | ||||||
|  |    }, | ||||||
|  |    "cell_type": "code", | ||||||
|  |    "source": [ | ||||||
|  |     "\"\"\"\n", | ||||||
|  |     "def __smallest_level(G, M, src, perLevel):\n", | ||||||
|  |     "    cur = Queue()\n", | ||||||
|  |     "    cur.enqueue(src)\n", | ||||||
|  |     "    cur.enqueue(None)\n", | ||||||
|  |     "    M[src] = True\n", | ||||||
|  |     "    temp = []\n", | ||||||
|  |     "    while not cur.isempty():\n", | ||||||
|  |     "        x = cur.dequeue()\n", | ||||||
|  |     "        if x is None:\n", | ||||||
|  |     "            if (len(temp) != 0 and temp != [src]):\n", | ||||||
|  |     "                perLevel.append(temp)\n", | ||||||
|  |     "            temp = []\n", | ||||||
|  |     "        else:\n", | ||||||
|  |     "            temp.append(x)\n", | ||||||
|  |     "            for adj in G.adjlists[x]:\n", | ||||||
|  |     "                if not M[adj]:\n", | ||||||
|  |     "                    M[adj] = True\n", | ||||||
|  |     "                    cur.enqueue(adj)\n", | ||||||
|  |     "            cur.enqueue(None)\n", | ||||||
|  |     "\n", | ||||||
|  |     "def smallest_level(G, src):\n", | ||||||
|  |     "    M = [False] * G.order\n", | ||||||
|  |     "    perLevel = []\n", | ||||||
|  |     "    __smallest_level(G, M, src, perLevel)\n", | ||||||
|  |     "    min = perLevel[0]\n", | ||||||
|  |     "    for element in perLevel:\n", | ||||||
|  |     "        if len(element) < len(min):\n", | ||||||
|  |     "            min = element\n", | ||||||
|  |     "    return min\n", | ||||||
|  |     "\"\"\"\n", | ||||||
|  |     "\n", | ||||||
|  |     "def smallest(G, src):\n", | ||||||
|  |     "    dist = [None] * G.order\n", | ||||||
|  |     "    q = Queue()\n", | ||||||
|  |     "    q.enqueue(src)\n", | ||||||
|  |     "    dist[src] = 0\n", | ||||||
|  |     "    small = G.order\n", | ||||||
|  |     "    d = 0\n", | ||||||
|  |     "    L = []\n", | ||||||
|  |     "    while not q.isempty():\n", | ||||||
|  |     "        x = q.dequeue()\n", | ||||||
|  |     "        if dist[x] > d:\n", | ||||||
|  |     "            if len(L) < small:\n", | ||||||
|  |     "                small = len(L)\n", | ||||||
|  |     "                Res = L\n", | ||||||
|  |     "            d += 1\n", | ||||||
|  |     "            L = []\n", | ||||||
|  |     "        for y in G.adjlists[x]:\n", | ||||||
|  |     "            if dist[y] == None:\n", | ||||||
|  |     "                dist[y] = dist[x] + 1\n", | ||||||
|  |     "                q.enqueue(y)\n", | ||||||
|  |     "                L.append(y)\n", | ||||||
|  |     "    return Res" | ||||||
|  |    ], | ||||||
|  |    "id": "9a3a85d15dccbb97", | ||||||
|  |    "outputs": [], | ||||||
|  |    "execution_count": 23 | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |    "metadata": { | ||||||
|  |     "ExecuteTime": { | ||||||
|  |      "end_time": "2024-12-14T12:43:03.858284Z", | ||||||
|  |      "start_time": "2024-12-14T12:43:03.855864Z" | ||||||
|  |     } | ||||||
|  |    }, | ||||||
|  |    "cell_type": "code", | ||||||
|  |    "source": [ | ||||||
|  |     "for s  in range(10):\n", | ||||||
|  |     "    print(s, \"=>\", smallest(G, s))" | ||||||
|  |    ], | ||||||
|  |    "id": "5be240ac4da2b002", | ||||||
|  |    "outputs": [ | ||||||
|  |     { | ||||||
|  |      "name": "stdout", | ||||||
|  |      "output_type": "stream", | ||||||
|  |      "text": [ | ||||||
|  |       "0 => [4]\n", | ||||||
|  |       "1 => [0, 2, 3]\n", | ||||||
|  |       "2 => [4, 7]\n", | ||||||
|  |       "3 => [1, 2, 5, 6]\n", | ||||||
|  |       "4 => [5]\n", | ||||||
|  |       "5 => [0, 8]\n", | ||||||
|  |       "6 => [4]\n", | ||||||
|  |       "7 => [5, 9]\n", | ||||||
|  |       "8 => [5]\n", | ||||||
|  |       "9 => [1, 4]\n" | ||||||
|  |      ] | ||||||
|  |     } | ||||||
|  |    ], | ||||||
|  |    "execution_count": 24 | ||||||
|   } |   } | ||||||
|  ], |  ], | ||||||
|  "metadata": { |  "metadata": { | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user