宝石收集,tarjan

0宝石收集 - 蓝桥云课 (lanqiao.cn)

复制代码
n=int(input())
s='0'+input()
m=int(input())
mp=[[] for i in range(n+1)]
for i in range(m):
    a,b=map(int,input().split())
    a+=1
    b+=1

    mp[a].append(b)


import sys
sys.setrecursionlimit(100000000)
dfn=[0 for i in range(n+1)]
low=[0 for i in range(n+1)]
cnt=0

stk=[]
instk=[0 for i in range(n+1)]

p=0
scc=[0 for i in range(n+1)]

def tarjan(x):
    global cnt,p
    cnt+=1
    dfn[x]=low[x]=cnt
    stk.append(x)
    instk[x]=1
    for i in mp[x]:
        if dfn[i]==0:
            tarjan(i)
            low[x]=min(low[x],low[i])
        elif instk[i]:
            low[x]=min(low[x],dfn[i])


    if dfn[x]==low[x]:
        p+=1
        y=stk.pop()
        instk[y]=0
        scc[y]=p
        while x!=y:
            y = stk.pop()
            instk[y] = 0
            scc[y] = p
for i in range(1,n+1):
    if dfn[i]==0:tarjan(i)

del instk,low,dfn

ru=[0 for i in range(p+1)]
h=[0 for i in range(p+1)]
l=[0 for i in range(p+1)]
nmp=[[] for i in range(p+1)]
for i in range(1,n+1):
    if s[i]=='0': h[scc[i]]+=1
    else : l[scc[i]]+=1
    for j in mp[i]:
        if scc[i]!=scc[j]:
            ru[scc[j]]+=1
            nmp[scc[i]].append(scc[j])
del mp

def dfs(x,a,b):
    ans=0
    vis=0
    for y in nmp[x]:
        ans=max(dfs(y,a+h[y],b+l[y]),ans)
        vis=1
    if vis==0:return min(a,b)
    else:return ans
ans=0
for i in range(1,p+1):
    if ru[i]==0:
        ans=max(ans,dfs(i,h[i],l[i]))
print(ans)
相关推荐
小超超爱学习99372 分钟前
大数乘法,超级简单模板
开发语言·c++·算法
Ricardo-Yang16 分钟前
SCNP语义分割边缘logits策略
数据结构·人工智能·python·深度学习·算法
凌波粒16 分钟前
LeetCode--344.反转字符串(字符串/双指针法)
算法·leetcode·职场和发展
啊哦呃咦唔鱼25 分钟前
LeetCode hot100-543 二叉树的直径
算法·leetcode·职场和发展
sinat_286945191 小时前
harness engineering
人工智能·算法·chatgpt
少许极端1 小时前
算法奇妙屋(四十三)-贪心算法学习之路10
学习·算法·贪心算法
算法鑫探2 小时前
10个数下标排序:最大值、最小值与平均值(下)
c语言·数据结构·算法·排序算法·新人首发
样例过了就是过了2 小时前
LeetCode热题100 爬楼梯
c++·算法·leetcode·动态规划
IronMurphy2 小时前
【算法三十七】51. N 皇后
算法·深度优先
DoUfp0bgq2 小时前
从直觉到算法:贝叶斯思维的技术底层与工程实现
算法