基环树

找环

无向图

拓扑排序找环

点击查看代码
bool vis[N];
queue<int> q;
void tp()
{
	for(int i=1;i<=n;i++) if(du[i]==0) q.push(i);
	while(!q.empty())
	{
		int x=q.front();
		for(int i=h[x];i;i=nxt[i])
		{
			int y=to[i];
			if(du[y]>1) //入度>=2的点即为环上的点 
			{
				du[y]--;
				vis[y]=1;
				if(du[y]==1) q.push(y);
			}
		}
	}
}

dfs找环

点击查看代码
int dep[N],fa[N],cnt;
void dfs(int u)
{
	dep[u]=++cnt;
	for(int i=h[u];i;i=nxt[i])
	{
		int v=to[i];
		if(v==fa[u]) continue;
		if(dep[v])
		{
			if(dep[v]<dep[u]) continue;
			vis[v]=1;
			for(;v!=u;v=fa[v])
			{
				vis[fa[v]]=1;
			}
		}
		else fa[v]=u,dfs(v);
	}
}

有向图

相比于无向图很容易处理,只需要不断dfs即可

点击查看代码
int fa[N];
void dfs(int u)
{
	vis[u]=1;
	if(vis[fa[x]]) mark=x;
	else dfs(fa[x]);
	return ;
}

一般遇到基环树的题,都与DP有关,或是一些树上操作,但大体思路是不变的,一般DP都是断环考虑,在强制连上环考虑,如果是树上操作,可以把基环树分成环和环连接的各个子树,在进行有关环和树的操作。

posted @ 2024-09-05 12:06  zhengchenxi  阅读(28)  评论(0)    收藏  举报