【CaiOJ】1147 强连通 Tarjan算法

来源:互联网 发布:java mysql学生 编辑:程序博客网 时间:2024/06/06 00:37

昨天没过掉的强联通分量模板题



#include <cstdio>#include <vector>#include <stack>#include <algorithm>#define C (c=nc())using namespace std;int low[20005];int dfn[20005];vector<int>a[20005];bool b[20005];stack<int>s;int m,n,ans,tot,q,w;inline char nc(void){static char ch[100010],*p1=ch,*p2=ch;return p1==p2&&(p2=(p1=ch)+fread(ch,1,100010,stdin),p1==p2)?EOF:*p1++;}inline void read(int &n){static char c;int f=1;n=0;C;while (c<'0'||c>'9') c=='-'?f=-1,C:C;while (c>='0'&&c<='9') n=(n<<3)+(n<<1)+c-48,C;return (void)(n*=f);}void dfs(int x){dfn[x]=low[x]=++tot;b[x]=1;s.push(x);for (int j=0;j<a[x].size();++j){if (dfn[a[x][j]]==0){dfs(a[x][j]);low[x]=min(low[x],low[a[x][j]]);}elseif (b[a[x][j]]){low[x]=min(low[x],dfn[a[x][j]]);}}if (low[x]==dfn[x]){while (x!=s.top()) b[s.top()]=0,s.pop();s.pop();b[x]=0;}return;}int main(void){read(n),read(m);for (int i=1;i<=m;++i){read(q),read(w);a[q].push_back(w);}dfs(1);for (int i=1;i<=n;++i)if (low[i]==dfn[i]) ++ans;printf("%d\n",ans);return 0;}



原创粉丝点击