经典问题,没什么好说的。
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <stack> #include <vector> using namespace std; const int maxn = 1000 + 10; vector<int> g[maxn], g1[maxn]; int n, m; int pre[maxn], lowlink[maxn], sccno[maxn], dfs_clock, scc_cnt; int scc_num[maxn], top[maxn], vis[maxn], dp[maxn], cnt; stack<int> s; void prework() { memset(pre, 0, sizeof(pre)); memset(lowlink, 0, sizeof(lowlink)); memset(sccno, 0, sizeof(sccno)); memset(vis, 0, sizeof(vis)); dfs_clock = scc_cnt = 0; cnt = 1; scanf("%d %d", &n, &m); for(int i = 1; i <= n; ++i) { g[i].clear(); g1[i].clear(); } while(!s.empty()) s.pop(); for(int i = 0; i < m; ++i) { int a, b; scanf("%d %d", &a, &b); g[a].push_back(b); } } void dfs(int u) { pre[u] = lowlink[u] = ++dfs_clock; s.push(u); for(int i = 0; i < g[u].size(); ++i) { int v = g[u][i]; if(!pre[v]) { dfs(v); lowlink[u] = min(lowlink[u], lowlink[v]); } else if(!sccno[v]) { lowlink[u] = min(lowlink[u], pre[v]); } } if(lowlink[u] == pre[u]) { scc_cnt++; scc_num[scc_cnt] = 0; while(1) { int x = s.top(); s.pop(); sccno[x] = scc_cnt; scc_num[scc_cnt]++; if(x == u) break; } } } void dfs1(int u) { vis[u] = 1; for(int i = 0; i < g1[u].size(); ++i) { int v = g1[u][i]; if(!vis[v]) dfs1(v); } top[cnt++] = u; } void slove() { for(int i = 1; i <= n; ++i) if(!pre[i]) dfs(i); for(int i = 1; i <= n; ++i) { for(int j = 0; j < g[i].size(); ++j) { int v = g[i][j]; if(sccno[i] != sccno[v]) g1[sccno[i]].push_back(sccno[v]); } } for(int i = 1; i <= scc_cnt; ++i) if(!vis[i]) dfs1(i); for(int i = 1; i <= scc_cnt; ++i) { int u = top[i]; dp[u] = scc_num[u]; for(int j = 0; j < g1[u].size(); ++j) { int v = g1[u][j]; dp[u] = max(dp[u], scc_num[u] + dp[v]); } } int ans = 0; for(int i = 1; i <= scc_cnt; ++i) ans = max(ans, dp[i]); printf("%d\n", ans); } int main() { freopen("in.txt", "r", stdin); int t; cin >> t; while(t--) { prework(); slove(); } return 0; }