ACM模板库

ACM模板库


tarjan

<pre><code class="language-cpp">#include&lt;iostream&gt; #include&lt;stack&gt; #include&lt;vector&gt; using namespace std; const int maxn = 1e6+5; int n, m; vector&lt;int&gt; edge[maxn]; namespace SCC{ int cnt, cntb; vector&lt;int&gt; belong[maxn]; bool instack[maxn]; int dfn[maxn]; int low[maxn]; stack&lt;int&gt; s; void init(){ cnt = cntb = 0; stack&lt;int&gt; _s; swap(_s, s); for(int i = 1; i &lt; n; i++){ edge[i].clear(); belong[i].clear(); instack[i] = false; dfn[i] = low[i] = 0; } } void Tarjan(int u){ dfn[u] = low[u]= ++cnt; s.push(u); instack[u] = true; for(int i = 0; i &lt; edge[u].size(); i++){ int v = edge[u][i]; if(!dfn[v]){ 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]){ ++cntb; while(233){ int node=s.top(); s.pop(); instack[node] = false; belong[cntb].push_back(node); if(node == u) break; } } } } int main() { cin &gt;&gt; n &gt;&gt; m; for(int i = 1; i &lt;= m; i++){ int u, v; cin &gt;&gt; u &gt;&gt; v; edge[u].push_back(v); } SCC::Tarjan(1); cout &lt;&lt; "id :"; for(int i = 1; i &lt;= n; i++) cout &lt;&lt; i &lt;&lt; " "; cout &lt;&lt; endl; cout &lt;&lt; "dfn :"; for(int i = 1; i &lt;= n; i++) cout &lt;&lt; SCC::dfn[i] &lt;&lt; " "; cout &lt;&lt; endl; cout &lt;&lt; "low :"; for(int i = 1; i &lt;= n; i++) cout &lt;&lt; SCC::low[i] &lt;&lt; " "; cout &lt;&lt; endl; for(int i = 1; i &lt;= SCC::cntb; i++){ cout &lt;&lt; "SCG " &lt;&lt; i &lt;&lt; " : "; for(int j = 0; j &lt; SCC::belong[i].size(); ++j) cout &lt;&lt; SCC::belong[i][j] &lt;&lt; " "; cout &lt;&lt; endl; } return 0; } </code></pre>

页面列表

ITEM_HTML