最小堆优先队列:
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()