标签:osi display mono qml tao 同时存在 div 深度 and
class Node:
val = 0
left = right = None
def __init__(self, val=0):
self.val = val
def getLCA(current, p, q):
left_val, right_val = p.val, q.val
parent = Node()
# 保证左结点的值小于右结点
if left_val > right_val:
left_val, right_val = right_val, left_val
while True:
if current.val > right_val:
parent = current
current = current.left
elif current.val < left_val:
parent = current
current = current.right
elif current.val == left_val or current.val == right_val:
return parent.val
else:
return current.val
def getLCA2(root, node1, node2):
if root == None:
return None
if root == node1 or root == node2:
return root
left = getLCA2(root.left, node1, node2)
right = getLCA2(root.right, node1, node2)
if left != None and right != None:
return root
elif left != None:
return left
elif right != None:
return right
else:
return None
void tarjan(int i)//Tarjan
{
int j;
DFN[i]=LOW[i]=++Dindex;//Index 时间戳
instack[i]=true;//标记入栈
Stap[++Stop]=i;//入栈
for (edge *e=V[i];e;e=e->next)//枚举所有相连边
{
j=e->t;//临时变量
if (!DFN[j])//j没有被搜索过
{
tarjan(j);//递归搜索j
if (LOW[j]<LOW[i])//回溯中发现j找到了更老的时间戳
LOW[i]=LOW[j];//更新能达到老时间戳
}
else if (instack[j] && DFN[j]<LOW[i])//如果已经印有时间戳 且 时间戳比较小,则有环
LOW[i]=DFN[j];//当前记录可追溯时间戳更新
}
if (DFN[i]==LOW[i])//可追溯最小的index是自己,表明自己是当前强连通分量的跟
{
Bcnt++;//强连通分量数增加
//在当前结点之后入栈并且还不属于其它的强连通分量的结点构成以当前结点为跟的强连通分量
do
{
j=Stap[Stop--];//出栈顶元素
instack[j]=false;//标记出栈
Belong[j]=Bcnt;//记录j所在的强连通分量编号
}
while (j!=i);//如果是当前元素,弹栈完成
}
}
void solve()
{
int i;
Stop=Bcnt=Dindex=0;
memset(DFN,0,sizeof(DFN));//标记为为搜索过
for (i=1;i<=N;i++) // 确保所有结点都被访问到
if (!DFN[i])
tarjan(i);
}
标签:osi display mono qml tao 同时存在 div 深度 and
原文地址:http://www.cnblogs.com/George1994/p/7111274.html