Click to open link
The Kosaraju algorithm for strong linking to graph
Answer = Max (A, b) for the number of points after the indentation and the degree of 0 respectively;
scc_cnt = 1; Answer = 0
#include <cstdio> #include <algorithm> #include <vector> #include <cstring> #include <stack >using namespace Std;const int maxn = 20000 + 10;vector<int> G[MAXN], g2[maxn];vector<int> S;int VIS[MAXN], SCCNO[MAXN], scc_cnt;void dfs1 (int u) {if (Vis[u]) return; Vis[u] = 1; for (int i=0; i<g[u].size (); ++i) DFS1 (G[u][i]); S.push_back (u);} void dfs2 (int u) {if (Sccno[u]) return; Sccno[u] = scc_cnt; for (int i=0; i<g2[u].size (); ++i) DFS2 (G2[u][i]);} void find_scc (int n) {scc_cnt = 0; S.clear (); memset (sccno, 0, sizeof sccno); memset (Vis, 0, sizeof vis); for (int i=0; i<n; ++i) DFS1 (i); for (int i=n-1; i>=0;-I.) {if (!sccno[s[i])) {scc_cnt++; DFS2 (S[i]); }}}int IN[MAXN], Out[maxn];int main () {int T, n, M; scanf ("%d", &t); while (t--) {scanf ("%d%d", &n, &m); for (int i=0; i<n; ++i) {g[i].clear (); G2[i].clear (); } For (int i=0; i<m; ++i) {int u, v; scanf ("%d%d", &u, &v); u--; v--; G[u].push_back (v); G2[v].push_back (U); } FIND_SCC (n); if (scc_cnt==1) {printf ("0\n"); Continue } memset (in, 0, sizeof in); memset (out, 0, sizeof out); for (int u=0, u<n; ++u) {for (int i=0; i<g[u].size (); ++i) {int &v = g[u][i]; if (sccno[u]! = Sccno[v]) {out[sccno[u]]++; in[sccno[v]]++; }}} int a = 0, b = 0; for (int i=1; i<=scc_cnt; ++i) {if (!in[i]) a++; if (!out[i]) b++; } printf ("%d\n", Max (A, b)); } return 0;}
hdu2767 proving equivalences, strong link to graph, Kosaraju algorithm