基本算法2

最小堆优先队列:
class YOUXIAN(object):
    def __init__(self):
        self._lst=[0]
        self._size=0
    def show(self):
        print(self._lst)
    def addOne(self,v):
        self._size += 1
        self._lst.append(v)
        pos=self._size
        while pos//2 >0:
            if self._lst[pos//2]>self._lst[pos]:
                self._lst[pos//2], self._lst[pos]=self._lst[pos],self._lst[pos//2]
            pos=pos//2
            # else:
            #     break
    def legal(self,pos):
        if pos*2+1>self._size:
            return pos*2
        else:
            if self._lst[pos*2]>self._lst[pos*2+1]:
                return pos*2+1
            else:
                return pos*2

    def delmin(self):
        if self._size >0:
            ret=self._lst[1]
            self._lst[1]=self._lst[self._size]
            self._size += -1
            self._lst.pop()
            pos=1
            while pos*2 <=self._size:
                newpos=self.legal(pos)
                if self._lst[pos]>self._lst[newpos]:
                    self._lst[pos],self._lst[newpos]=self._lst[newpos],self._lst[pos]
                pos=newpos
            return ret

    def buildHeap(self,alist):
        for i in alist:
            self.addOne(i)



bh = YOUXIAN()
bh.buildHeap([9,5,6,2,3])
bh.show()
最短路径:


import heapq
 
import sys
class YouXianQueue(object):
    def __init__(self):
        self._lst=[]
        self._index=0

    def push(self,item,prime):
        heapq.heappush(self._lst,(prime,self._index,item))
        self._index +=1
    def show(self):
        print(self._lst)

    def len(self):
        return len(self._lst)

    def change(self,item,priority):
        try:
            temp=None
            for num,i in enumerate(self._lst):
                if i[-1] == item:

                    temp=num
                    break

            temp_v=self._lst[temp]
            del self._lst[temp]

            heapq.heappush(self._lst,(priority,temp_v[1],temp_v[2]))
        except Exception as ex:
            print(ex)

    def pop(self):
        return  heapq.heappop(self._lst)[-1]

class NODE(object):
    def __init__(self,value):
        self._value=value
        self.connections={}
        self._parent=None
        self._dis=sys.maxsize

    def getWeight(self,item):
        return self.connections.get(item,0)
    def addNeibor(self,item,weight=1):
        self.connections[item]=weight

    @property
    def value(self):
        return self._value

    @value.setter
    def value(self,value):
        self._value=value
    @property
    def parent(self):
        return self._parent
    @parent.setter
    def parent(self,item):
        self._parent=item


    def getNeibor(self):
        return self.connections.keys()

    def setParent(self,item):
        self.parent=item

    @property
    def dis(self):
        return self._dis

    @dis.setter
    def dis(self,value):
        self._dis=value



class GRAPH(object):
    def __init__(self):
        self.sons={}
        self.size=0

    def addSon(self,value):
        self.sons[value]=NODE(value)
        self.size +=1

    def getSon(self,value):
        return self.sons.get(value,None)
    def getall(self):
        return  self.sons.values()

    def addEdge(self,value1,value2,weight=1):
        if value1 not in self.sons:
            self.addSon(value1)
        if value2 not in self.sons:
            self.addSon(value2)
        self.sons[value1].addNeibor(self.sons[value2],weight)

def genData(datas):
    g=GRAPH()
    for data in datas:
        g.addEdge(data[0],data[1],data[2])
    return g

def minPaht(g,start):
    path=YouXianQueue()
    first=g.getSon(start)
    first.dis=0
    first.parent=None
    for son in g.getall():
        path.push(son,son.dis)
    while path.len()>0:
        current=path.pop()
        for son in current.getNeibor():
            newdis=current.dis+current.getWeight(son)
            if son.dis > newdis:
                son.dis=newdis
                son.parent=current
                path.change(son,newdis)


def showPah(g,dest):
    item=g.getSon(dest)
    print(item.value)
    while item.parent:
        item=item.parent
        print(item.value)

def main():
    datas=[('u','v',2),('u','w',5),('u','x',1),('v','u',2),('v','w',3),('v','x',2),
('w','v',3),('w','u',5),('w','x',3),('w','y',1),('w','z',5),('z','w',5),('z','y',1),
    ('y','z',1),('y','w',1),('y','x',1),('x','y',1),('x','w',3),('x','v',2),('x','u',1)]

    g=genData(datas)
    minPaht(g,"u")
    showPah(g,'y')
最小加权树:
import heapq
import sys
class YouXianQueue(object):
    def __init__(self):
        self._lst=[]
        self._index=0

    def push(self,item,prime):
        heapq.heappush(self._lst,(prime,self._index,item))
        self._index +=1
    def show(self):
        print(self._lst)

    def __contains__(self, item):
        temp=[data[2] for data in self._lst]
        return item in temp

    def len(self):
        return len(self._lst)

    def change(self,item,priority):
        try:
            temp=None
            for num,i in enumerate(self._lst):
                if i[-1] == item:

                    temp=num
                    break

            temp_v=self._lst[temp]
            del self._lst[temp]

            heapq.heappush(self._lst,(priority,temp_v[1],temp_v[2]))
        except Exception as ex:
            print(ex)

    def pop(self):
        return  heapq.heappop(self._lst)[-1]

class NODE(object):
    def __init__(self,value):
        self._value=value
        self.connections={}
        self._parent=None
        self._dis=sys.maxsize

    def getWeight(self,item):
        return self.connections.get(item,0)
    def addNeibor(self,item,weight=1):
        self.connections[item]=weight

    @property
    def value(self):
        return self._value

    @value.setter
    def value(self,value):
        self._value=value
    @property
    def parent(self):
        return self._parent
    @parent.setter
    def parent(self,item):
        self._parent=item


    def getNeibor(self):
        return self.connections.keys()

    def setParent(self,item):
        self.parent=item

    @property
    def dis(self):
        return self._dis

    @dis.setter
    def dis(self,value):
        self._dis=value



class GRAPH(object):
    def __init__(self):
        self.sons={}
        self.size=0

    def addSon(self,value):
        self.sons[value]=NODE(value)
        self.size +=1

    def getSon(self,value):
        return self.sons.get(value,None)
    def getall(self):
        return  self.sons.values()

    def addEdge(self,value1,value2,weight=1):
        if value1 not in self.sons:
            self.addSon(value1)
        if value2 not in self.sons:
            self.addSon(value2)
        self.sons[value1].addNeibor(self.sons[value2],weight)

def genData(datas):
    g=GRAPH()
    for data in datas:
        g.addEdge(data[0],data[1],data[2])
    return g

def minPaht(g,start):
    path=YouXianQueue()
    first=g.getSon(start)
    first.dis=0
    first.parent=None
    for son in g.getall():
        path.push(son,son.dis)
    while path.len()>0:
        current=path.pop()
        for son in current.getNeibor():
            newdis=current.dis+current.getWeight(son)
            if son in path and son.dis > newdis:
                son.dis=newdis
                son.parent=current
                path.change(son,newdis)


def showPah(g,dest):
    item=g.getSon(dest)
    print(item.value)
    while item.parent:
        item=item.parent
        print(item.value)

def main():
    datas=[('A','B',2),('A','C',3),('B','C',1),('B','D',1),('B','E',4),('E','F',1),('F','C',5),('F','G',1),('D','E',1)]
    temp=[]
    for data in datas:
        temp.append(data)
        temp.append((data[1],data[0],data[2]))
    g=genData(temp)
    minPaht(g,"A")
    names=['A','B','C','D','E','F','G']
    sum=0
    for name in names:
        sum += g.getSon(name).dis
    print('sum',sum)

main()
原文地址:https://www.cnblogs.com/testzcy/p/12366211.html