当前位置: 首页>>代码示例>>Python>>正文


Python UnionFind.UnionFind类代码示例

本文整理汇总了Python中UnionFind.UnionFind的典型用法代码示例。如果您正苦于以下问题:Python UnionFind类的具体用法?Python UnionFind怎么用?Python UnionFind使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。


在下文中一共展示了UnionFind类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。

示例1: KruskalMST

def KruskalMST(graph:EdgeWeightedGraph):

    MST = []
    EdgeSequence=[]
    UF = UnionFind(graph.numVertices())

    #Pre-processing the edges
    PQ = []
    for item in graph.adj:
        PQ += graph.adj[item]
    heapq.heapify(PQ)

    while (len(PQ)>0) & (len(MST) < graph.numVertices()-1):
        e = heapq.heappop(PQ)
        v = e.either()
        w = e.other(v)

        if (UF.connected(v,w)):
            continue
        else:
            UF.union(v,w)
            heapq.heappush(MST, e)
            EdgeSequence.append(e)

        cluster = set()
        for item in UF.id:
            cluster.add(item)

        print ("cluster:", cluster, len(cluster))
        print (e.weight)
    return MST
开发者ID:gimaik,项目名称:Coursera-Stanford-Algorithms-Analysis-and-Design,代码行数:31,代码来源:Kruskal.py

示例2: MinimumSpanningTree

def MinimumSpanningTree(V,E,W):
    """
    Return the minimum spanning tree of an undirected graph G=(V,E) with total its cost.
    W is a weights dictionary containing weight w of edge (u,v)
    as the dict entry W[(u,v)] = W[(v,u)] = w (W should be symmetric).
    The tree is returned as a list of edges.

    Notes: Kruskal's algorithm for minimum spanning 
	   Adpated from D. Eppstein' implementation (April 2006 version).
    """
    
    from UnionFind import UnionFind # used for forests manipulation
    # Kruskal's algorithm: sort edges by weight, and add them one at a time.
    # We use Kruskal's algorithm, first because it is very simple to
    # implement once UnionFind exists, and second, because the only slow
    # part (the sort) is sped up by being built in to Python.
    subtrees = UnionFind()
    tree = []
    #edges = [(G[u][v],u,v) for u in G for v in G[u]]
    edges = [(W[(u,v)],u,v) for (u,v) in E]
    edges.sort()
    cost = 0.0
    for w,u,v in edges:
        if subtrees[u] != subtrees[v]:
            tree.append((u,v))
            subtrees.union(u,v)
	    cost+=w
    return (tree,cost)
开发者ID:izquierdo,项目名称:kr,代码行数:28,代码来源:graphs.py

示例3: MinimumSpanningTree

    def MinimumSpanningTree(self):
        """
        Return the minimum spanning tree of an undirected graph .
        self.graph should be represented in such a way that self.graph[u][v] gives the
        length of edge u,v, self.graph[u] should give the list of the neighbours,
        and self.graph[u][v] should always equal self.graph[v][u].
        self.graph should be a dictionary where each key is a vertex in the graph and
        each value is a dictionary of destination:weight pairs
        The tree is returned as a list of edge tuples.

        Should adapt to use Numpy?
        """

        # Kruskal's algorithm: sort edges by weight, and add them one at a time.
        # We use Kruskal's algorithm, first because it is very simple to
        # implement once UnionFind exists, and second, because the only slow
        # part (the sort) is sped up by being built in to Python.
        subtrees = UnionFind()
        tree = []
        
        # edges are found on initialization
        self.edges.sort()
        #print self.edges
        for W,u,v in self.edges:
            if self.verbose: print subtrees
            if subtrees[u] != subtrees[v]:
                tree.append((u,v))
                subtrees.union(u,v)
        self.m_s_tree = tree
开发者ID:aplested,项目名称:aligator,代码行数:29,代码来源:MinimumSpanningTree.py

示例4: test_getitem_returns_proper_root

 def test_getitem_returns_proper_root(self):
     union_find = UnionFind()
     union_find.union('parent', 'first_child')
     union_find.union('first_child', 'last_child')
     self.assertEqual(union_find['parent'], 'parent')
     self.assertEqual(union_find['first_child'], 'parent')
     self.assertEqual(union_find['last_child'], 'parent')
开发者ID:MagnetonBora,项目名称:homework,代码行数:7,代码来源:TestMinimumSpanningTree.py

示例5: foodHeuristic

def foodHeuristic(state, problem):
    position, foodGrid = state
    "*** YOUR CODE HERE ***"
    nodes = foodGrid.asList()
    nodes.append(position)
    
    G = {}
    for p1 in nodes:
        for p2 in nodes:
            dist1 = p1,p2
            dist2 = p2,p1
            if p1<p2:
                if dist1 in problem.heuristicInfo:
                    dist = problem.heuristicInfo[dist1]
                elif dist2 in problem.heuristicInfo:
                    dist = problem.heuristicInfo[dist2]
                else:
                    dist = mazeDistanceAStar(p1, p2, problem.getStartingGameState())
                    #dist = manDistance(p1, p2)
                    problem.heuristicInfo[p1,p2] = dist
                G[p1,p2] = G[p2,p1] = dist
                    
            if p1 == p2:
                G[p1,p2] = 0

    subtrees = UnionFind() 
    edges = [(G[p1,p2],p1,p2) for p1 in nodes for p2 in nodes ]
    edges.sort()
    hDistance = 0
    for W,u,v in edges:
        if subtrees[u] != subtrees[v]:
            hDistance += W
            subtrees.union(u,v)
    return hDistance
开发者ID:ptLong,项目名称:Project1CS188.1x,代码行数:34,代码来源:searchAgents.py

示例6: kcluster

def kcluster(nodeset, edgeset, num_clusters, k):#WRONG
    """
        Standard Algorithm
    """
    #TODO: Validate Edgecase when k> len(nodeset) or len(edgeset)
    # Sort edgeset by Cost
    sorted_edges = sorted(edgeset, key=lambda x: x[2])
    # Add each node to nodeset into UnionFind S
    uf = UnionFind()
    for node in nodeset:
        uf[node]

    # For each edge (u,v) in edgeset
    for edge in sorted_edges:
        #print 'Num Clusters {0}'.format(uf.size())
        head, tail, wt = edge
        if num_clusters == k:
            print "STOP {0}".format(edge)
            max_crossing = wt
            return (uf , wt)

        if uf[head] != uf[tail]:
            uf.union(head, tail)
            num_clusters -=1


  
    return (uf , wt)
开发者ID:ibelle,项目名称:DataStructuresAndAlgorithms,代码行数:28,代码来源:clustering.py

示例7: MinimumSpanningTree

def MinimumSpanningTree(graph, weights):
    """
    Return the minimum spanning tree of an undirected graph G.
    G should be represented in such a way that iter(G) lists its
    vertices, iter(G[u]) lists the neighbors of u, G[u][v] gives the
    length of edge u,v, and G[u][v] should always equal G[v][u].
    The tree is returned as a list of edges.
    """
    if not isinstance(graph, UndirectedGraph):
        raise ValueError("Provided graph is not an UndirectedGraph.")
    for vertex in range(graph.n_vertices):
        for child in graph.adjacency_list[vertex]:
            if weights[vertex, child] != weights[child, vertex]:
                raise ValueError("Assymetric weights provided.")

    # Kruskal's algorithm: sort edges by weight, and add them one at a time.
    # We use Kruskal's algorithm, first because it is very simple to
    # implement once UnionFind exists, and second, because the only slow
    # part (the sort) is sped up by being built in to Python.
    subtrees = UnionFind()
    tree = []
    for W, u, v in sorted((weights[u][v], u, v) for u in range(graph.n_vertices)
                          for v in graph.adjacency_list[u]):
        if subtrees[u] != subtrees[v]:
            tree.append((u, v))
            subtrees.union(u, v)
    return tree
开发者ID:jacksoncsy,项目名称:menpo,代码行数:27,代码来源:MinimumSpanningTree.py

示例8: __getTree

 def __getTree(self):
     # Sort edges by decreasing pheromone levels
     self.edgeInfos.sort(key=geteiPheromoneLevel, reverse=True)
     start = 0
     # Current edges that will be inspected
     C = []
     # Data structure for Kruskal's algorithm
     subtrees = UnionFind() 
     solution = []
     degrees = defaultdict(int) # Map of degrees for each vertice
     
     # While we don't have n-1 edges in our solution
     while len(solution) != self.n - 1:
         # Pick the the next nCanditates edges
         C = self.edgeInfos[start : start + self.nCandiates]
         
         # Sort the edge selection by increasing cost
         C.sort(key=geteiCost)
         start += self.nCandiates
         
         for ei in C:
             u, v = ei.u, ei.v
             # Test if edge can be added to the current solution
             if subtrees[u] != subtrees[v] and \
                degrees[u] < self.d and degrees[v] < self.d:  # Check constraint
                 solution.append(ei)
                 # Increment degrees of vertices of the added edge
                 degrees[u] += 1
                 degrees[v] += 1
                 # Update subtrees
                 subtrees.union(u, v)
     return solution
开发者ID:niroyb,项目名称:AntBased_DCMST,代码行数:32,代码来源:AB_DCMST.py

示例9: connectedComponentOutsidePermittedRegionBlacken

def connectedComponentOutsidePermittedRegionBlacken(img, vstart, vend):
  labels = UnionFind()
  # pass 1
  labeled = set()
  for currentPoint in iterImg(img):
    y,x = currentPoint
    if sum(img[y,x]) <= 100: # black
      continue
    labeled.add(currentPoint)
    neighbors = getSurrounding1(img, y, x)
    # if all 4 neighbors are black or unlabeled (ie, 0 labeled white neighbors), assign new label
    # if only 1 neighbor is white, assign its label to current point
    # if more than 1 of the neighbors are white, assign one of their labels to the current point, and note equivalence
    labeled_white_neighbors = [neighbor for neighbor in neighbors if sum(img[neighbor]) > 100 and neighbor in labeled]
    if len(labeled_white_neighbors) == 0: # assign new label
      z = labels[currentPoint]
    else:
      for neighbor in labeled_white_neighbors:
        labels.union(neighbor, currentPoint)
  # now blacklist all sets st they have a child that is in the forbidden region
  blacklist = set()
  for currentPoint in labeled:
    y,x = currentPoint
    if y < vstart or y > vend:
      blacklist.add(labels[currentPoint])
  # pass 2 - blacken blacklisted components
  for currentPoint in labeled:
    y,x = currentPoint
    curset = labels[currentPoint]
    if curset in blacklist:
      img[y,x] = (0,0,0)
开发者ID:gkovacs,项目名称:extract-subtitle,代码行数:31,代码来源:connected_components.py

示例10: read_nodes

def read_nodes(filename):
    clusters = UnionFind()
    all_nodes = []
    with open(filename) as inputfile:
        next(inputfile)
        for line in inputfile:
            clusters.make_set(int(line.rstrip().replace(' ', ''), 2))
            all_nodes.append(int(line.rstrip().replace(' ', ''), 2))
    return clusters, all_nodes
开发者ID:LorenzoBi,项目名称:algorithm_design,代码行数:9,代码来源:clustering_big.py

示例11: minimumSpanningTree

def minimumSpanningTree(edges):
    subtrees = UnionFind()
    tree = []
    for e in edges:
        if subtrees[e.v1] != subtrees[e.v2]:
            tree.append(e)
            subtrees.union(e.v1,e.v2)
            e.v1.degree += 1
            e.v2.degree += 1
    return tree
开发者ID:msobell,项目名称:astar,代码行数:10,代码来源:astar.py

示例12: max_spacing_k_clustering

def max_spacing_k_clustering(G, V, k):
    '''
    Apply a variant of Kruskal's MST algorithm to max-spacing k-clustering problems.
    Return the maximum spacing of k-clustering.
    
    G is a list which represents a graph. 
    Each value of G, G[i], is a tuple (u,v,edge_cost) which represents two vertices of an edge and the cost of that edge.
    V is a list of vertices.
    k is the number of clusters.
    '''
    # use Union-Find data structure to represent clusters
    unionfind=UnionFind()
    
    heap=[] # edges
    for u,v,cost in G:
        heappush(heap,(cost,u,v))
      
    n=len(V) # number of vertices
    i=0
    while i<n-k: # An MST has n-1 edges. Stops early by k-1 steps to produce a k-clustering.
        cost,u,v=heappop(heap) # pop the edge with least cost
             
        # check cycle. No cycles if either vertex has not be added to any cluster or they belong to different clusters.
        if unionfind.find(u) is None or unionfind.find(v) is None or unionfind.find(u)!=unionfind.find(v):
            # add the edge.
            unionfind.union(u,v)
            i+=1
            
#     unionfind.getNumGroups()
    
    # in case that vertices of next edges has been added to the same cluster.
    while True:
        cost,u,v=heappop(heap)
        if unionfind.find(u) is None or unionfind.find(v) is None or unionfind.find(u)!=unionfind.find(v):
            return cost
开发者ID:BurningXFlame,项目名称:SADA_Assignments,代码行数:35,代码来源:clustering.py

示例13: kruskalsMST

	def kruskalsMST(self):
		edges = self.sortedGraph
		uf = UnionFind()
		T = []
		total_cost = 0
		for cost,source,target in edges:
			s1,s2 = uf[source],uf[target]
			if s1 != s2 :
				uf.union(s1,s2)
				T.append((source,target))
				total_cost += cost
		return total_cost
开发者ID:pjayadeep,项目名称:Algorithms,代码行数:12,代码来源:mst.py

示例14: GetMinimumSpanningTree

def GetMinimumSpanningTree(graph):
    subtrees = UnionFind()
    spanningTree = WeightedGraph()
    sorted_weighted_edges_list = sorted(
        [(u, v, graph[u][v]) for u in graph for v in graph[u]],
        key=lambda item: item[-1]
    )
    for u, v, w in sorted_weighted_edges_list:
        if subtrees[u] != subtrees[v]:
            spanningTree.AddEdge(u, v, w)
            subtrees.union(u, v)
    return spanningTree
开发者ID:MagnetonBora,项目名称:homework,代码行数:12,代码来源:MinimumSpanningTree.py

示例15: importGraph

def importGraph(filename = 'clustering2.txt'):
    """Imports pairs of endpoints into an adjancey list graph representation.
    Keep track of both edges and vertices."""
    f = open(filename)
    (totalnodes, bits) = [int(x) for x in f.readline().split()]
    nodecount = 0
    nodes = {}
    for line in f:
        nodes[nodecount] = [int(x) for x in line.split()]
        nodecount += 1
    f.close()

    count = 0
    buckets = {}
    # prep buckets
    for i in range(0, bits - 1):
        for j in range(i + 1, bits):
            buckets[(i, j)] = {}
            # print i, j
            count += 1
    print count

    count = 0
    for nkey, nval in nodes.items():
        count += 1
        if count % 1000 == 0:
            print count
        for i in range(0, bits - 1):
            for j in range(i + 1, bits):
                nvalminustwo = tuple(nval[0:i] + nval[i+ 1:j] + nval[j+1: bits])

                if not buckets[(i, j)].has_key(nvalminustwo):
                    buckets[(i, j)][nvalminustwo] = [nkey]
                else:
                    buckets[(i, j)][nvalminustwo].append(nkey)

    uf = UnionFind()

    for n in xrange(len(nodes)):
        uf[n]

    count = 0
    for key in buckets.keys():
        for valkey in buckets[key]:

            count += 1
            if count % 1000000 == 0:
                print count
            uf.union(*buckets[key][valkey])

    return uf
开发者ID:pconerly,项目名称:StanfordProgrammingProblems,代码行数:51,代码来源:clustering2.py


注:本文中的UnionFind.UnionFind类示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。