五步法寻找无向图节点之间所有路径


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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SpaceSunflower

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值