耳分解&双极定向&边三连通
一张无向图的最大独立集与最大简单环长度至少有一个
耳分解
无向图版本
定义
-
耳与开耳
在无向图
中存在子图 ,若简单路径或简单环 满足 ,则称 为 关于 的耳,若 是简单路径,又称其为开耳。 -
对于无向连通图
,若连通图序列 满足:-
是一个简单环或者一个点 -
是 的子图 -
,则 构成一个耳(开耳)则称
为图 的耳分解(开耳分解)
-
定理
-
无向连通图
存在耳分解当且仅当 边双联通必要性:耳分解的流程中每个
都是边双联通的充分性:考虑 dfs 树,找到一条非树边
,令这个与树上路径组成的环为假设现在已经生成了
,找到一个点 满足 ,若 必然可以找到,然后将 子树内选择一条跨出子树的返祖边加上 到返祖边端点的路径 作为一个耳生成 ,由于边双连通不存在割点一定可以,至于最后多出来的非树边可以直接作为一个耳加入。 -
至少含有三个点的无自环无向连通图
存在开耳分解当且仅当 点双连通。证明是类似的,但是返祖边的另一个端点不能是
,根据点双连通性显然成立。
有向图版本
定义类似,有性质有向图可耳分解当且仅当强连通。
这也告诉我们一个边双可以通过定向变为强连通。
构造方法:
建立
树,父亲向子节点定向,返祖边后代向祖先定向即可。
混合图可以被定向为强连通图,当且仅当以下条件同时满足:
- 将有向边看作无向边,图边双连通
- 将无向边看作两条有向边后图强连通
我们断言,选出任意无向边,一定存在一种定向方式使得定向后本性质仍然满足。
条件一显然仍然满足,下面论证条件二。
设当前图为
否则,图至多最终分裂为两个强连通分量,因为只断掉一条边,因此对于每个其他点
因此此时把边定向为
双极定向
给定无向图
- 加入
后 点双连通 的圆方树上所有方点都在一条链上- 存在一种对
进行定向的方法使得得到一个 DAG,有且只有 没有入度, 没有出度。 - 存在一个节点排列
, ,满足任意前缀和任意后缀的导出子图都是连通的。
注意加入边
然后假设
实现方面:
考虑以
提出
按照
边三连通
建立无向图的
树(非树边都是返祖边),将所有非树边随机赋权,定义树边的权值覆盖其的非树边权值异或和(树上差分) 如果一个边集的
,则说明是割集(充分条件) dzy love Chinese
边三连通图定义为最小割集不小于
满足 连通则 满足 , 满足 连通则 连通
考虑边权:
- 树边
边权为零或者边权等于某条非树边, 与 及其子树内的点不边三连通 - 两条树边
边权相同,则必然为一条到根的链上的边,因此断掉这两条边后子树 减去子树 的部分被独立出去。
注意暴力删边是错误的
利用异或运算来简化判断。
对于情况 1,直接给子树
对于情况
可以通过打标记和再次 dfs 实现。
并且注意到,我们自底向上判断时,对于边权相同的树边只需要保留最浅的一条即可,画图易证。
模版:
双极定向:
int Dfn[N],Low[N],Idx,in[N],f[N],rew[N];
vector<int>Lik;
bool dfs(int u,int fa){
Dfn[u]=Low[u]=++Idx;rew[Idx]=u;int tag=(u==Ed);
for(auto v:ne[u])if(v!=fa){
if(!Dfn[v])tag|=dfs(v,u),Low[u]=min(Low[u],Low[v]),in[u]++,f[v]=u;
else Low[u]=min(Low[u],Dfn[v]);
}
if(tag)Lik.push_back(u);
return tag;
}
int p[N],tot,dev[N];
vector<int>de[N];
void bianli(int x){
if(dev[x])return ;
dev[x]=1;
p[++tot]=x;
for(auto y:de[x])bianli(y);
}
void to_direct(){
/*双极定向,还需要有一个遍历的在里面*/
St=col[St],Ed=col[Ed];
dfs(St,0);
queue<int>q;
for(int i=1;i<=node;++i)if(!in[i])q.push(i);
while(!q.empty()){
int u=q.front();q.pop();
if(u==Ed)continue;
/*
shift,这里还需要注意到这条特别的链
*/
de[f[u]].push_back(u);
de[rew[Low[u]]].push_back(u);
if(f[u]){
--in[f[u]];
if(!in[f[u]])q.push(f[u]);
}
}
reverse(Lik.begin(),Lik.end());
for(auto x:Lik)bianli(x);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!