图的遍历:经典广搜,建议写模板
查看原帖
图的遍历:经典广搜,建议写模板
723069
Ohmic_Messiah楼主2024/4/28 01:45

具体解释见于注释

import sys
sys.setrecursionlimit(10**6)#递归深度放大一点,防止递归崩掉,不过这一题数据弱一些,倒也不怕超出1000层
vis=[0]*(10**6)
a=[0]*(10**6)
def dfs(u,v):#u是被访问的点
    if vis[u]:#如果u已经被访问过
        return
    vis[u]=1#别忘了标记这时候u已经被v访问过了,v是从u的访问点中遍历的
    a[u]=v#如果没有被访问就标记目前为最大访问,因为是倒序遍历
    for i in (beifangwen[u]):
        if not vis[i]:
            dfs(i,v)
n,m=map(int,input().split())
beifangwen=[[] for _ in range(n+1)]#每一个点被谁访问过
for i in range(m):
    c,d=map(int,input().split())
    beifangwen[d].append(c)
for i in range(n,0,-1):#从大到小遍历,这样a中存储的就是最大的访问点
    dfs(i,i)
for i in range(1,n+1):
    print(a[i],end=" ")

2024/4/28 01:45
加载中...