コード例 #1
0
ファイル: graph_coloring.py プロジェクト: agga1/AG
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)
コード例 #2
0
ファイル: get_RN.py プロジェクト: agga1/AG
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
コード例 #3
0
ファイル: max_clique.py プロジェクト: agga1/AG
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
コード例 #4
0
ファイル: clique_tree_diff_ind.py プロジェクト: agga1/AG
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)
コード例 #5
0
ファイル: lexBFS_tests.py プロジェクト: agga1/AG
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))
コード例 #6
0
def is_chordal(G: List[Node]) -> bool:
    ordered_v = lexBFS(G)
    return is_PEO(G, ordered_v)