萌新求助Tarjan+DFS第八个点TLE
查看原帖
萌新求助Tarjan+DFS第八个点TLE
222865
迟暮天复明心華楼主2021/8/24 18:04
#define rep(i, x, y) for(int i = x; i < y; ++i)
#define int ll

/*预处理*/

int low[1000010], dfn[1000010], n, m, head[1000010], stk[1000010];
int top, cnt, dfncnt, scccnt, color[100010], vis[1000010];
int x[1000100], y[1000010], deg[1000010], f[1000010];
int maxn[1000010];
struct Edge {
  int to, nxt;
} e[2000010];
void add(int u, int v) {
  e[++cnt].to = v;
  e[cnt].nxt = head[u];
  head[u] = cnt;
}

void tarjan(int u) { //tarjan缩点算法
  vis[u] = 1;
  stk[++top] = u;
  dfn[u] = low[u] = ++dfncnt;
  for(int i = head[u]; i; i = e[i].nxt) {
    int v = e[i].to;
    if(!dfn[v]) {
      tarjan(v);
      low[u] = min(low[u], low[v]);
    }
    else if(vis[v]) low[u] = min(low[u], dfn[v]);
  }
  if(low[u] == dfn[u]) {
    ++scccnt;
    while(stk[top] != u) {
      vis[stk[top]] = 0;
      color[stk[top]] = scccnt;
      maxn[scccnt] = max(maxn[scccnt], stk[top]); // maxn记录当前scc中最大点值
      --top;
    }
    maxn[scccnt] = max(maxn[scccnt], u);
    vis[stk[top]] = 0;
    color[stk[top]] = scccnt;
    --top;
  }
}

void dfs(int u, int fa) { //DFS
  f[u] = maxn[u];
  for(int i = head[u]; i; i = e[i].nxt) {
    int v = e[i].to;
    if(v == fa) continue;
    dfs(v, u);
    f[u] = max(f[u], f[v]);
  }
}

signed main() {
 
  read(n), read(m);
  rep(i, 0, m) {
    read(x[i]), read(y[i]);
    add(x[i], y[i]);
  }
  
  /*tarjan*/
  rep(i, 1, n + 1) if(!dfn[i]) tarjan(i);
  
  /*建新图*/
  memset(e, 0, sizeof(e));
  memset(head, 0, sizeof(head));
  cnt = 0;
  rep(i, 0, m) if(color[x[i]] != color[y[i]]) ++deg[color[y[i]]], add(color[x[i]], color[y[i]]);
  
  /*DFS*/
  rep(i, 1, scccnt + 1) if(!f[i]) dfs(i, i);
  
  rep(i, 1, n + 1) print(f[color[i]], ' ');
  
  return 0;
}
2021/8/24 18:04
加载中...