关于树的划分
  • 板块学术版
  • 楼主Soul_Love
  • 当前回复1
  • 已保存回复2
  • 发布时间2024/1/3 17:45
  • 上次更新2024/1/3 20:58:44
查看原帖
关于树的划分
110009
Soul_Love楼主2024/1/3 17:45

最近在学 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

2024/1/3 17:45
加载中...