边双缩点的一些疑问
  • 板块学术版
  • 楼主Daniel_yao
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/7/26 10:29
  • 上次更新2023/11/3 07:36:59
查看原帖
边双缩点的一些疑问
519573
Daniel_yao楼主2023/7/26 10:29

有两种缩点的方法:

void tarjan(int x, int fa) {
  dfn[x] = low[x] = ++idx;
  stk[++top] = x, ins[x] = 1;
  for (int i = h[x]; i; i = e[i].nx) {
    int y = e[i].v;
    if(y == fa) continue;
    if(!dfn[y]) {
      tarjan(y, x);
      low[x] = min(low[x], low[y]);
    } else if(ins[y]) low[x] = min(low[x], dfn[y]); 
  }
  if(dfn[x] == low[x]) {
    int y;
    dcc[x] = ++col;
    do {
      y = stk[top--];
      dcc[y] = col;
      ins[y] = 0;
    } while(y != x);
  }
}
void tarjan(int x, int la) {
  dfn[x] = low[x] = ++idx;
  for (int i = h[x]; i; i = e[i].nx) {
    int y = e[i].v;
    if(!dfn[y]) {
      tarjan(y, i);
      if(dfn[x] < low[y]) f[i] = f[i ^ 1] = 1;
      low[x] = min(low[x], low[y]);
    } else if(i != (la ^ 1)) {
      low[x] = min(low[x], dfn[y]);
    }
  }
}

void dfs(int x, int col) {
  dcc[x] = col;
  siz[col]++;
  for (int i = h[x]; i; i = e[i].nx) {
    int y = e[i].v;
    if(dcc[y] || f[i]) continue;
    dfs(y, col);
  }
}

前者有重边时是不是会寄掉??

2023/7/26 10:29
加载中...