求助 Tarjan 60 pts
查看原帖
求助 Tarjan 60 pts
363006
wangyibo201026楼主2022/3/4 17:16

代码:


#include<bits/stdc++.h>

using namespace std;

int n, m, u[500005], v[500005], out[100005];

int tot, head[10005];

int dfn[100005], low[100005], stk[100005], top, ind, cnt[100005], pos, color[100005];
bool vis[100005];

struct node{
  int to, next;
}edges[5000005];

void add(int x, int y){
  tot++;
  edges[tot].to = y;
  edges[tot].next = head[x];
  head[x] = tot;
}

void tarjan(int x){
  stk[++top] = x;
  dfn[x] = low[x] = ++ind;
  vis[x] = true;
  for(int i = head[x]; i; i = edges[i].next){
    int v = edges[i].to;
    if(!dfn[v]){
      tarjan(v);
      low[x] = min(low[x], low[v]);
    }
    else if(vis[v]){
      low[x] = min(low[x], dfn[v]);
    }
  }
  if(dfn[x] == low[x]){
    pos++;
    while(stk[top + 1] != x){
      color[stk[top]] = pos;
      cnt[pos]++;
      vis[stk[top--]] = false;
    }
  }
}

void Solve(){
  cin >> n >> m;
  for(int i = 1; i <= m; i++){
    cin >> u[i] >> v[i];
    if(u[i] == v[i]){
      continue;
    }
    add(u[i], v[i]);
  }
  for(int i = 1; i <= n; i++){
    if(!dfn[i]){
      tarjan(i);
    }
  }
  for(int i = 1; i <= n; i++){
    for(int j = head[i]; j; j = edges[j].next){
      int v = edges[j].to;
      if(color[i] != color[v]){
        out[color[v]]++;
      }
    }
  }
  int ans = 0;
  for(int i = 1; i <= pos; i++){
    if(!out[i]){
      ans++;
    }
  }
  cout << ans;
}

int main(){
#ifdef debug
  freopen("test.in", "r", stdin);
  freopen("test.out", "w", stdout);
#endif
  Solve();
  return 0;
}
2022/3/4 17:16
加载中...