最近在学 top cluster ,因为没看懂划分是什么“最长合法前缀”啥的,就靠理解写了一种看起来很不靠谱的写法。
inline void build(int u,int fa)
{
int k=st.size(),ct=0;
for(int i=h[u];i;i=e[i].next)
{
if(e[i].v==fa) continue;
st.push(e[i].v);
build(e[i].v,u);
if(b[e[i].v])
{
ct++;
b[u]=b[e[i].v];
}
}
//BN[i]表示i这个节点是否为界点
if(!fa||ct>1||(int)st.size()-k>=ql)//这里为止都是正常的划分
{
BN[u]=1;//上界点
//loc[i]表示i在哪个簇
int dow=st.top();//先随便找一个点作为下界点
num2++;//新建一个簇
while(st.size()&&st.top()!=u)
{
if(BN[st.top()]) dow=st.top();//如果有界点,那么这个界点就是下界点
else loc[st.top()]=num2;//标记内点和簇路径上的点
st.pop();
}
loc[dow]=num2;//令界点所处的簇为它是下界点时所在的簇(这个好像是唯一的吧)
BN[dow]=1;//下界点
CL_f[dow]=u;//伸缩树上的父亲
}
}
我这么划分是不是会出错?(正确性,时间复杂度保证啥的)
还有就是
if(BN[st.top()]) dow=st.top();
这一段代码是否会同一次while循环里多次执行(也就是会违背树簇的定义)?
还有我每次弹出是都没有弹出上界点,因为它可以作为其他簇的下界点,这样想对不对呢?
真的理解不了了,求求了qwq