def edges(self): flow_edge_list = Bag() for v in range(self._v): for e in self.adj(v): if e.head() != v: flow_edge_list.add(e) return flow_edge_list
def __init__(self, synsets=None, hypernyms=None): self._nouns_dict = defaultdict(Bag) self._reverse_nouns_dict = defaultdict(str) max_id = 0 with open(synsets) as f: lines = f.readlines() for line in lines: items = "".join(line.splitlines()).split(',') nouns = items[1].split(' ') for i in range(len(nouns)): if nouns[i] not in self._nouns_dict: nouns_list = Bag() else: nouns_list = self._nouns_dict.get(nouns[i]) nouns_list.add(int(items[0])) self._nouns_dict[nouns[i]] = nouns_list self._reverse_nouns_dict[int(items[0])] = items[1] max_id = max(max_id, int(items[0])) self._dg = Digraph(max_id + 1) with open(hypernyms) as f1: lines = f1.readlines() for line in lines: items = "".join(line.splitlines()).split(',') v = int(items[0]) for i in range(1, len(items)): w = int(items[i]) self._dg.add_edge(v, w) # if not self._is_dag(self._dg): # raise AttributeError('digraph is not acyclic') self._sap = SAP(self._dg)
def __init__(self, v, e=0): if v < 0: raise AttributeError('Number of vertices in a Graph must be nonnegative') self._v = v self._e = e self._adj = defaultdict(Bag) for vertice in range(v): self._adj[vertice] = Bag()
def __init__(self, v): if v < 0: raise AttributeError('Number of vertices must be non-negative') self.V = v self.E = 0 self.adj = defaultdict(Bag) for i in range(v): self.adj[i] = Bag()
def __init__(self, v): """ Initializes an empty graph with V vertices and 0 edges. :param v: the number of vertices """ if v < 0: raise ValueError('Number of vertices must be non-negative') self.V = v self.E = 0 self._indegree = [0 for _ in range(v)] self.adj = defaultdict(Bag) for v in range(v): self.adj[v] = Bag()
def __init__(self, v): """ Initializes an empty graph with V vertices and 0 edges. :param v: the number of vertices """ if v < 0: raise ValueError('Number of vertices must be non-negative') self.V = v + 1 self.E = 0 # self.adj = defaultdict(deque) /* without LinkedList */ self.adj = defaultdict(Bag) for v in range(v): # self.adj[v] = deque() /* without LinkedList */ self.adj[v] = Bag()
def edges(self): adj_list = Bag() for v in range(self.get_V()): self_loops = 0 for e in self.adj_vertices(v): if e.item.other( v ) > v: # if e.v == v, return e.w; if e.w == v, return e.v adj_list.add(e.item) # add only one copy of each self loop (self loops will be consecutive) elif e.item.other(v) == v: if self_loops % 2 == 0: adj_list.add(e.item) self_loops += 1 return adj_list
def main(): file_name = '../resources/tinyDG.txt' with open(file_name) as f: ints = list() for line in f.read().split('\n'): ints.append(line) vertices, edges = int(ints[0]), int(ints[1]) graph = Digraph(vertices) # print(graph) inp = ints[ 2:] # skip first 2 lines in tiny.DG.txt i.e. # of vertices and edges sources = Bag() sources.add(1) sources.add(5) sources.add(10) for i in range(edges): v, w = inp[i].split(' ') graph.add_edge(int(v), int(w)) # print(graph) # s = 6 # reachable from single source vertex, s # dfs = DirectedDFS(graph, int(s)) # print(dfs) # reachable from many source vertices, sources dfs = DirectedDFS(graph, sources) # print(dfs) for v in range(graph.get_V()): if dfs.marked(v): print(f'{v} ')
def edges(self): adj_list = Bag() for v in range(self.get_V()): for e in self.adj_vertices(v): adj_list.add(e) return adj_list
def recognizes(self, txt): # first create a digraph starting from state 0 dfs = DirectedDFS(self._graph, 0) pc = Bag() # find a set of states reachable from start 0 for v in range(self._graph.get_V()): if dfs.marked(v): pc.add(v) # Compute possible NFA states for txt[i+1] for i in range(len(txt)): # read next input character if txt[i] == '*' or txt[i] == '|' or txt[i] == '(' or txt[i] == ')': raise ValueError( f'text contains the meta-character "{txt[i]}"') match = Bag() for v in pc: if v.item == self._m: continue if self._regex[v.item] == txt[i] or self._regex[v.item] == '.': match.add(v.item + 1) dfs = DirectedDFS(self._graph, match) # print('dfs',dfs) pc = Bag() for v in range(self._graph.get_V()): if dfs.marked(v): pc.add(v) if pc.size() == 0: return False # check for accept state for v in pc: if v.item == self._m: return True return False