description
给定由 n 个点 m 条边组成的无向连通图,保证没有重边和自环。
你需要找出所有边,满足这些边恰好存在于一个简单环中。一个环被称为简单环,当且仅当它包含的所有点都只在这个环中被经过了一次。
注意到这些边可能有很多条,你只需要输出他们编号的异或和即可。
analysis
-
然而复习了一波tarjantarjantarjan,其实这个简单环就是求点双
-
求出每个点双,判断点双里的边数是否等于点双点数
-
这个不能暴力求,方法就是记录每个点有多少条返祖边、返祖边的异或和
-
因为这些返祖边指向的点和该点本身肯定在同一个点双中
-
感觉tarjantarjantarjan这种东西还是记下好一点,不过跑得好慢很奇怪
code
#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
#define MAXN 1000005
#define MAXM 2000005
#define ll int
#define reg register ll
#define max(x,y) ((x>y)?(x):(y))
#define min(x,y) ((x<y)?(x):(y))
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i)
#define rep(i,a) for (reg i=last[a];i;i=next[i])
using namespace std;
ll last[MAXM],next[MAXM],tov[MAXM],id[MAXM]

给定一个无向连通图,不含重边和自环,目标是找到所有存在于简单环中的边,并输出这些边编号的异或和。简单环定义为每个点仅经过一次。分析表明,可以通过计算每个点的返祖边及其异或和来确定环。虽然tarjan算法可以解决,但其运行速度较慢。
最低0.47元/天 解锁文章
909

被折叠的 条评论
为什么被折叠?



