Codeforces 962F:Tarjan点双连通分量

前置技能:Tarjan三算法:强连通分量、点双连通分量、边双连通分量。资料:Tarjan三大算法之双连通分量(双连通分量)

题意:给出一个无向图,求出所有只在一个简单环上出现过的边。简单环:环上每两个点都不同。

题解:这个东西,稍微想一下发现,他就是个仙人掌那样的分量。。。思路基本一致。

思路很清晰,就是找到简单环,那么我们可以先找环,然后判断他是不是简单的。而点双连通分量的定义就是,每一个连通分量中的两点之间,都存在两条点不重复路径,他等价于任意两条边都存在于一个简单环中,那么这个东西不就是我们要的环吗?然后思考如何判断他是简单的,emm很显然。。点数=边数,代码比较emmm。。。烦。。。注意好多单链要特判扔掉。

Code:

#include
using namespace std;
const int maxn = 1e5+100;
int first[maxn],des[maxn*2],nxt[maxn*2],tot;
int cnt_n[maxn],cnt_e[maxn],bcc_no[maxn],bcc_cnt;
int dfn[maxn],low[maxn],dfs_clock;
int st[maxn*2],top;
vector ans;
vector temp;
int m,n;
inline void addEdge(int x,int y){
    tot++;
    des[tot] = y;
    nxt[tot] = first[x];
    first[x] = tot;
}
void input(){
    cin>>n>>m;
    for (int i=0;i

你可能感兴趣的:(Codeforces)