def graph_coloring(G: List[Node]) -> int: color = [0] * len(G) ordered = lexBFS(G) for v in ordered: neigs = G[v].out used = {color[u] for u in neigs} min_free_col = 1 while min_free_col <= len(G): if min_free_col not in used: break min_free_col += 1 color[v] = min_free_col return max(color)
def get_RN(G: List[Node]) -> List[set[int]]: RN = [set() for _ in range(len(G))] parent = [0] * len(G) ord = lexBFS(G) for v in ord: # RN[v] - zbiór sąsiadów pojawiających się wcześniej niż v for el in ord: if el == v: break if el in G[v].out: RN[v].add(el) parent[v] = el return RN
def biggest_clique(G: List[Node]) -> int: """ returns size of the biggest clique in given chordal graph """ assert (is_chordal(G)), "Received graph is not chordal! " ord = lexBFS(G) max_size = 0 RN = [set() for _ in range(len(G)) ] # RN[v] - zbiór sąsiadów pojawiających się wcześniej niż v for v in ord: for el in ord: if el == v: break if el in G[v].out: RN[v].add(el) max_size = max(max_size, len(RN[v]) + 1) return max_size
def clique_tree(G: List[Node]): ord = lexBFS(G) parent = [0] * len(G) cliques = [] # list of all cliques clique_par = [0] * len(G) # index of parent clique clique_nr = [0] * len(G) # nr of clique corresponding to vertex i # creating RN list RN = [set() for _ in range(len(G)) ] # RN[v] - zbiór sąsiadów pojawiających się wcześniej niż v for v in ord: for el in ord: if el == v: break if el in G[v].out: RN[v].add(el) parent[v] = el # creating tree v = ord[0] cliques.append({v}) clique_nr[v] = 0 clique_par[0] = 0 for i in range(1, len(ord)): v = ord[i] # print(" \t at v ", v) if len(RN[v].symmetric_difference(cliques[clique_nr[parent[v]]])) == 0: clique_nr[v] = clique_nr[parent[v]] cliques[clique_nr[v]].add(v) # print(" adding to cliq nr ", clique_nr[v], " and now " ,cliques[clique_nr[v]]) # print(" now clique is : ", cliques[clique_nr[v]) else: cliques.append(RN[v] | {v}) newInd = len(cliques) - 1 clique_nr[v] = newInd # print(" new clique nr ", newInd, " w parent ", clique_nr[parent[v]]) # print(" now clique is : ", cliques[clique_nr[v]) clique_par[newInd] = clique_nr[parent[v]] print(cliques) print(clique_par)
graphs = [] for name in os.listdir("res/chordal"): graphs.append(f"res/chordal/{name}") def test_lex_BFS(G: List[Node], vs: List[int]) -> bool: n = len(G) pi = [None] * n for i, v in enumerate(vs): pi[v] = i for i in range(n - 1): for j in range(i + 1, n - 1): Ni = G[vs[i]].out Nj = G[vs[j]].out verts = [pi[v] for v in Nj - Ni if pi[v] < i] if verts: viable = [pi[v] for v in Ni - Nj] if not viable or min(verts) <= min(viable): return False return True for graph in graphs: G = create_graph(graph) vs = lexBFS(G) graph = graph.split("/")[-1] print(test_lex_BFS(G, vs))
def is_chordal(G: List[Node]) -> bool: ordered_v = lexBFS(G) return is_PEO(G, ordered_v)