1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
const int maxn = 4e5 + 5 #define INF 1000000000 #define MOD 1000000007 #define F first #define S second using namespace std; typedef long long ll; typedef pair<int,int> P; vector<int> G[maxn]; int n,dfn[maxn],low[maxn],st[maxn]; int vis[maxn]; int cmp[maxn],cnt,tot,t; void (int v){ dfn[v] = low[v] = ++tot; vis[v] = 1; st[t++] = v; for(auto to:G[v]){ if(!vis[to]){ dfs(to); low[v] = min(low[v],low[to]); } else if(vis[to]==1) low[v]=min(low[v],dfn[to]); } if(dfn[v] == low[v]){ int u; cnt++; do{ u = st[--t]; cmp[u] = cnt; vis[u] = 2; }while(u != v); } } int tarjan(){ t = tot = cnt = 0; memset(vis,0,sizeof(vis)); for(int i = 1;i <= n;i++) if(!dfn[i]) dfs(i); return cnt; } int main(){ return 0; }
|
近期评论