蓝桥杯算法提高VIP-卡勒沃夫之弱水路三千(提高型)PYTHON-数据结构

目录

题目描述

​编辑解题思路

代码

先构建邻接矩阵

读取输入,并初始化邻接矩阵

初始化标记矩阵

依次遍历头节点

递归遍历头结点的子节点的深度遍历

总代码


题目描述

解题思路

1.首先我先开始想做这个题的思路就是单纯的读出这两个然后直接添加到某个人前面,但是这样只会让这个人在某个人的情况下的先后顺序是对的但是有可能和其他人顺序不对。这样写出的答案只对了50%

2.后来我想到了类似于邻接表深度遍历的算法,一个人当头结点,只要在她后面的人都当他的子节点。然后我就用类似邻接表深度遍历的算法依次遍历,只要遍历过的结点就设置个标记,当遍历到最深的一个结点的时候也就是他没有子节点时,那么他肯定是最后那个结点。然后把他插入列表。然后深度遍历递归返回,这就就可以一直找到该排到最后一个的结点。

代码

先构建邻接矩阵

class Graph:
    def __init__(self,V):
        self.graph=defaultdict(list)#如果字典没有该元素时可以添加元素不会报错
        self.V=V#有多少个人,也就是length
    def addEdge(self,u,v):
        self.graph[u].append(v)

其中addEdge函数就是在头结点后加入尾结点。

就是表示排在该人后面的人。

读取输入,并初始化邻接矩阵

    n=int(input())
    for i in range(n):
        N=int(input())
        dict={}#设置一个结点看该元素是否被访问过
        A,B=[],[]
        for j in range(N):
            a,b=input().strip().split()
            A.append(a)
            B.append(b)
        g=Graph(len(set(A+B)))
        for pair in zip(A,B):
            g.addEdge(pair[0],pair[1])

初始化邻接表的个数要用set计算。

给邻接表添加结点时用zip。

初始化标记矩阵

        for element in set(A+B):
            dict.update({element:False})

依次遍历头节点

    def tuopuSort(self,dic):
        visited=dic#或者visited=dic.copy()
        stack=[]
        for key in dic.keys():
            if visited[key]==False:
                self.topuSortUntil(key,visited,stack)
        for i in stack:
            print(i,end=' ')
        print()

递归遍历头结点的子节点的深度遍历

    def topuSortUntil(self,v,visited,stack):
        visited[v]=True
        for i in self.graph[v]:
            if visited[i]==False:
                self.topuSortUntil(i,visited,stack)
        stack.insert(0,v)#当前位置的最后一个,所以插入第一个

注意列表的插入位置

总代码

from collections import defaultdict
class Graph:
    def __init__(self,V):
        self.graph=defaultdict(list)#如果字典没有该元素时可以添加元素不会报错
        self.V=V#有多少个人,也就是length
    def addEdge(self,u,v):
        self.graph[u].append(v)
    def topuSortUntil(self,v,visited,stack):
        visited[v]=True
        for i in self.graph[v]:
            if visited[i]==False:
                self.topuSortUntil(i,visited,stack)
        stack.insert(0,v)#当前位置的最后一个,所以插入第一个
    def tuopuSort(self,dic):
        visited=dic#或者visited=dic.copy()
        stack=[]
        for key in dic.keys():
            if visited[key]==False:
                self.topuSortUntil(key,visited,stack)
        for i in stack:
            print(i,end=' ')
        print()
if __name__=='__main__':
    n=int(input())
    for i in range(n):
        N=int(input())
        dict={}#设置一个结点看该元素是否被访问过
        A,B=[],[]
        for j in range(N):
            a,b=input().strip().split()
            A.append(a)
            B.append(b)
        g=Graph(len(set(A+B)))
        for pair in zip(A,B):
            g.addEdge(pair[0],pair[1])
        for element in set(A+B):
            dict.update({element:False})
        g.tuopuSort(dict)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值