import csv
paths=[]
class Stack(object):
"""栈"""
def __init__(self):
self.items = []
def is_empty(self):
"""判断是否为空"""
return self.items == []
def push(self, item):
"""加入元素"""
self.items.append(item)
def pop(self):
"""弹出元素"""
return self.items.pop()
def peek(self):
"""返回栈顶元素"""
if len(self.items)==0:
#print("栈顶元素为空")
return False
return self.items[len(self.items)-1]
def size(self):
"""返回栈的大小"""
return len(self.items)
def travel(self):
print("Path:"+str(self.items))
return self.items
# print(self.items)
# paths.append(self.items)
# print(paths)
def main(start,end,path=[]):
dict1={}
with open('data/yelp/t.links', 'r') as f1:
reader = csv.reader(f1)
data1 = list(reader)
for i in range(0, len(data1)):
InitObj = str(data1[i])
#print(InitObj)
InitStr = InitObj[2:len(data1[i]) - 6]
Links = InitStr.replace("\\t", " ")
name_a, name_b = Links.split(' ', 1)
#print(name_a+name_b)
if name_a in dict1.keys():
dict1[name_a].append(str(name_b))
else:
dict1[name_a]=[]
dict1[name_a].append(str(name_b))
if name_b in dict1.keys():
dict1[name_b].append(str(name_a))
else:
dict1[name_b]=[]
dict1[name_b].append(str(name_a))
#print(dict1)
i = i + 1
#print(dict)
#with open('../params.txt', 'w') as f:
# for key, value in dict1.items():
# f.write(key)
# f.write(': ')
# f.write(str(value))
# f.write('\n')
with open('data/yelp/t.rating', 'r') as f2:
reader = csv.reader(f2)
data2 = list(reader)
for i in range(0, len(data2)):
InitObj = str(data2[i])
InitStr = InitObj[2:len(data2[i]) - 6]
Links = InitStr.replace("\\t", " ")
name_a, name_b = Links.split(' ', 1)
if name_a in dict1.keys():
dict1[name_a].append(str(int(name_b)+50000))
else:
dict1[name_a]=[]
dict1[name_a].append(str(int(name_b)+50000))
if str(int(name_b)+50000) in dict1.keys():
dict1[str(int(name_b)+50000)].append(name_a)
else:
dict1[str(int(name_b)+50000)]=[]
dict1[str(int(name_b)+50000)].append(name_a)
i = i + 1
print("数据处理完成")
#with open('../params2.txt', 'w') as f:
# for key, value in dict2.items():
# f.write(key)
# f.write(': ')
# f.write(str(value))
# f.write('\n')
# number>=50000 item
# number< 50000 user
#设置九万个水桶
IfInMainStack=[0]*900000
#设置位于MainStack中的水桶为“1”
IfInMainStack[int(start)]=1
#Init
MainStack=Stack()
AidedStack=Stack()
MainStack.push(start)
AidedStack.push(dict1[start])
k=0
# 判断推出循环:如果主栈不存在任何元素
NewList=[]
import copy
dict2=copy.deepcopy(dict1)
print("字典处理完成")
#print(dict2)
while MainStack.peek():
dict1=copy.deepcopy(dict2)
#如果start==end,直接返回
#print("status:"+str(MainStack.peek()))
if start==end:
return [];
#如果不是start!=end而且辅助栈存在就判断是否建栈
else:
if MainStack.peek() == end:
#记录
l1=MainStack.travel()
l2=copy.deepcopy(l1)
paths.append(l2)
#print(paths)
# 肖战的同时,更新if
AidedStack.pop()
delContent = MainStack.pop()
IfInMainStack[int(delContent)] = 0
elif not AidedStack.peek():
#print("消栈")
#print("判断矩阵"+str(IfInMainStack))
AidedStack.pop()
delContent = MainStack.pop()
#print(AidedStack.peek())
#print("削掉" + str(delContent))
IfInMainStack[int(delContent)] = 0
elif AidedStack.peek():
#print("建栈")
Templist = AidedStack.pop()
AddContent = Templist[0]
MainStack.push(Templist[0])
IfInMainStack[int(AddContent)] = 1
NewList = dict1[Templist[0]]
#print(dict1)
# 查询邻接节点
# 剔除掉已经在主栈中的节点
# 删除:找到并删除MainStack中已经存在的元素
length = len(NewList)
f = 0
while f < length:
if IfInMainStack[int(NewList[f])] == 1:
NewList.remove(str(NewList[f]))
f=f-1
length=length-1
f = f + 1
del Templist[0]
# print(NewList)
AidedStack.push(Templist)
# 判断是否肖战
# newlist有信息并且不是end
AidedStack.push(NewList)
#print("newlist"+str(NewList))
return paths
if __name__ == '__main__':
pathlist=main('3','6')
print(pathlist)
五步法寻找无向图节点之间所有路径
于 2022-10-11 22:17:44 首次发布