目录
题目描述
解题思路
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)