【演算法模板】Tarjan求強連通分量
阿新 • • 發佈:2018-12-13
#include<iostream> #include<cstring> #include<stack> #include<vector> using namespace std; const int MAXN=1000+10; stack<int> s; vector<int> g[MAXN]; int n,m; int Intex,dfn[MAXN],low[MAXN]; int scc[MAXN],cnt; bool instack[MAXN]; void tarjan(int u) { dfn[u]=low[u]=++Intex; s.push(u); instack[u]=true; for(int i=0;i<g[u].size();i++) { int v=g[u][i]; if(dfn[v]==-1) { tarjan(v); low[u]=min(low[u],low[v]); } else if(instack[v]) low[u]=min(low[u],dfn[v]); } if(dfn[u]==low[u]) { cnt++; int v; do { v=s.top(); s.pop(); scc[v]=cnt; instack[v]=false; } while(u!=v); } } int main() { memset(dfn,-1,sizeof(dfn)); cin>>n>>m; for(int i=1;i<=m;i++) { int x,y; cin>>x>>y; g[x].push_back(y); } for(int i=1;i<=n;i++) if(dfn[i]<0)tarjan(i); cout<<cnt<<endl; return 0; }