示例#1
0
def dsatur(orig, g, trans, frat, col, silent=True):
    satdeg = {}
    ncols = {}
    for v in g:
        satdeg[v] = 0
        ncols[v] = set()

    def upd(v, coloring, colorstats, graph):
        vcol = coloring[v]
        for w in graph.neighbours(v):
            if w in ncols and vcol not in ncols[w]:
                ncols[w].add(vcol)
                satdeg[w] += 1

    def vchoice(uncolored, coloring, graph):
        # First choice: some max deg vertex
        if len(coloring) == 0:
            maxv = None
            maxdeg = -1
            for v in graph:
                d = graph.degree(v)
                if d > maxdeg:
                    maxdeg = d
                    maxv = v
            del satdeg[v]
            del ncols[v]
            return v
        # Now choose vertex that sees a maximum num of colors
        # Todo: us a priority queue here.
        res = maxsat = -1
        for v in satdeg:
            if satdeg[v] > maxsat:
                maxsat = satdeg[v]
                res = v

        del satdeg[res]
        del ncols[res]
        return res

    return color_by_ordering(g.undirected(), vchoice, next_free_color, upd)
示例#2
0
def min_deg(orig, g, trans, frat, col, silent=True):
    undir_g = g.undirected()
    degBuckets = []
    degrees = {}  # Keep track of remaining degree
    maxdegree = 0
    for v in g:
        d = undir_g.degree(v)
        if d >= len(degBuckets):
            degBuckets.extend([set() for x in range(len(degBuckets), d + 1)])
        degBuckets[d].add(v)
        degrees[v] = d
        maxdegree = max(maxdegree, d)

    for d in xrange(0, maxdegree+1):
        if d >= len(degBuckets):
            degBuckets.extend([set() for x in range(len(degBuckets), d + 1)])

    def vchoice(uncolored, coloring, graph):
        mindeg = 0
        while len(degBuckets[mindeg]) == 0:
            mindeg += 1

        v = iter(degBuckets[mindeg]).next()  # Just get any
        degBuckets[mindeg].remove(v)

        # Update neighbours
        for w in graph.neighbours(v):
            if w not in degrees or w == v:
                continue  # Was already processed
            deg = degrees[w]
            degBuckets[deg].remove(w)
            degBuckets[deg-1].add(w)
            degrees[w] -= 1

        del degrees[v]
        return v

    return color_by_ordering(undir_g, vchoice, next_free_color)
示例#3
0
def min_deg(orig, g, trans, frat, col, silent=True):
    undir_g = g.undirected()
    degBuckets = []
    degrees = {}  # Keep track of remaining degree
    maxdegree = 0
    for v in g:
        d = undir_g.degree(v)
        if d >= len(degBuckets):
            degBuckets.extend([set() for x in range(len(degBuckets), d + 1)])
        degBuckets[d].add(v)
        degrees[v] = d
        maxdegree = max(maxdegree, d)

    for d in xrange(0, maxdegree + 1):
        if d >= len(degBuckets):
            degBuckets.extend([set() for x in range(len(degBuckets), d + 1)])

    def vchoice(uncolored, coloring, graph):
        mindeg = 0
        while len(degBuckets[mindeg]) == 0:
            mindeg += 1

        v = iter(degBuckets[mindeg]).next()  # Just get any
        degBuckets[mindeg].remove(v)

        # Update neighbours
        for w in graph.neighbours(v):
            if w not in degrees or w == v:
                continue  # Was already processed
            deg = degrees[w]
            degBuckets[deg].remove(w)
            degBuckets[deg - 1].add(w)
            degrees[w] -= 1

        del degrees[v]
        return v

    return color_by_ordering(undir_g, vchoice, next_free_color)