萌新求助经典算法,悬一关
  • 板块学术版
  • 楼主WilliamFranklin
  • 当前回复9
  • 已保存回复11
  • 发布时间2024/7/19 19:16
  • 上次更新2024/7/19 20:56:11
查看原帖
萌新求助经典算法,悬一关
330901
WilliamFranklin楼主2024/7/19 19:16

对于 tarjan 求边双连通分量,一般官方给的代码都是:

void tarjan(int u, int from)
{
    dfn[u] = low[u] = ++ timestamp;
    stk[ ++ top] = u;

    for (int i = h[u]; ~i; i = ne[i])
    {
        int j = e[i];
        if (!dfn[j])
        {
            tarjan(j, i);
            low[u] = min(low[u], low[j]);
            if (dfn[u] < low[j])
                is_bridge[i] = is_bridge[i ^ 1] = true;
        }
        else if (i != (from ^ 1))
            low[u] = min(low[u], dfn[j]);
    }

    if (dfn[u] == low[u])
    {
        ++ dcc_cnt;
        int y;
        do {
            y = stk[top -- ];
            id[y] = dcc_cnt;
        } while (y != u);
    }
}

但我想到能不能合并一下,写得更简单,但不知道对不对:

void tarjan(int u, int from) {
	dfn[u] = low[u] = ++timestamp;
	stk[++top] = u;
	
	for (int i = h[u]; ~i; i = ne[i]) {
		int j = e[i];
		if (!dfn[j]) {
			tarjan(j, i);
			
			low[u] = min(low[u], low[j]);
		} else if (i != (from ^ 1)) {
			low[u] = min(low[u], dfn[j]);
		}
	}
	if (dfn[u] == low[u]) {
	    is_bridge[from] = is_bridge[from ^ 1] = 1;
		++dcc_cnt;
		
		int y;
		
		do {
			y = stk[top--];
			id[y] = dcc_cnt;
		} while (y != u);
	}
}

收采纳者悬一关。

2024/7/19 19:16
加载中...