非简单路径问题
异或
瞬间转移
原路返回等于没选中间的边,于是真正有贡献的是环。
路径拆分
一条非简单路径可以拆分为一条简单路径和若干个环。
路径可以通过环改变其方向,环又可以瞬间转移选择。
所以该图能够到达的路径长度为任意一条简单路径的长度和所有环组成的异或空间,可以利用线性基维护这个东西。
环的异或空间
几个子环可以形成所有的环的子集。
找出子环
void dfs(int x){
check[x]|=true;
for(point *i(head[x]);i!=NULL;i=i->next)
if(check[i->to])B.insert(dis[x]^dis[i->to]^i->w);
else dis[i->to]=dis[x]^i->w,dfs(i->to);
}
可用于同余
同余
模数为m,考虑点,m为2,为奇质数,为奇数,为偶数
特殊的环
一条简单路径可以看做一个特殊的环,环长为路径长的两倍,特别地一条边的环长为边权两倍。
瞬间转移
原路返回m次,该条路径等于没走,于是可以瞬间转移到任意一个环。
环的同余空间
- 对于特殊环而言,所有的边同余空间可以组成特殊环的所有子集(显然)
- 对于简单环而言,对于特殊环的同余空间和简单环的同余空间,组成了环的同余空间
- 能到达的环的长度和为所有环和m的gcd
路径拆分
任意一条非简单路径可以拆分为一条简单路径和一些环。