心得:Tarjan算法跑有向图无向图的区别

(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦

  • 这几天写了几道强连通分量的裸题,有有向图的,有无向图的。
  • 好几题习惯性敲完后,并没有意识到有向图和无向图的区别
  • 然后每次wa好久,最后发现改掉一句话就ac了


然后每次把f(v==Fa)continue;这句代码注释掉就ac了,呵呵~

无向图:

void dfs(int u,int Fa){
  dfn[u]=low[u]=++inde;
  vis[u]=1;stak[++top]=u;
  for(int i=head[u];~i;i=cw[i].nex){
    int v = cw[i].v;
    if(v==Fa)continue;//区别就在于这句话
    if(!dfn[v]){
      dfs(v,u);
      low[u]=min(low[u],low[v]);
    }else if(vis[v]==1) low[u]=min(low[u],dfn[v]);
  }
  if(dfn[u]==low[u]){
    qltNum++;
    int v;
    do{
      v=stak[top--];
      vis[v]=2;
      qltId[v]=qltNum;
    }while(v!=u);
  }
}

有向图:

void dfs(int u,int Fa){
  dfn[u]=low[u]=++inde;
  vis[u]=1;stak[++top]=u;
  for(int i=head[u];~i;i=cw[i].nex){
    int v = cw[i].v;
    //if(v==Fa)continue;//这里就是区别
    if(!dfn[v]){
      dfs(v,u);
      low[u]=min(low[u],low[v]);
    }else if(vis[v]==1) low[u]=min(low[u],dfn[v]);
  }
  if(dfn[u]==low[u]){
    qltNum++;
    int v;
    do{
      v=stak[top--];
      vis[v]=2;
      qltId[v]=qltNum;
    }while(v!=u);
  }
}

猜你喜欢

转载自blog.csdn.net/qq_39599067/article/details/81321884