1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 #include <vector> 7 #include <stack> 8 using namespace std; 9 const int maxn=111111; 10 vector<int>g[maxn]; 11 vector<int>to[maxn]; 12 stack<int>s; 13 int n,m; 14 int ans; 15 int lowlink[maxn],pre[maxn],c[maxn],dp[maxn],sccno[maxn],scc_cnt,dfs_clock; 16 void dfs(int u){ 17 pre[u]=lowlink[u]=++dfs_clock; 18 s.push(u); 19 for(int i=0;i<g[u].size();i++){ 20 int v=g[u][i]; 21 if(!pre[v]){ 22 dfs(v); 23 lowlink[u]=min(lowlink[u],lowlink[v]); 24 } 25 else if(!sccno[v])lowlink[u]=min(lowlink[u],pre[v]); 26 } 27 if(lowlink[u]==pre[u]){ 28 ++scc_cnt; 29 while(1){ 30 int x=s.top();s.pop(); 31 sccno[x]=scc_cnt; 32 ++c[scc_cnt]; 33 if(x==u)break; 34 } 35 } 36 } 37 void find_scc(int n){ 38 dfs_clock=scc_cnt=0; 39 memset(pre,0,sizeof pre); 40 memset(sccno,0,sizeof sccno); 41 memset(c,0,sizeof c); 42 for(int i=1;i<=n;i++)if(!pre[i])dfs(i); 43 } 44 int DP(int u){ 45 if(dp[u])return dp[u]; 46 int res=0; 47 for(int i=0;i<to[u].size();i++){ 48 int v=to[u][i]; 49 res=max(DP(v),res); 50 } 51 return dp[u]=res+c[u]; 52 } 53 int main() 54 { 55 // freopen("in","r",stdin); 56 while(scanf("%d%d",&n,&m)>0){ 57 for(int i=1;i<=n;i++)g[i].clear(); 58 while(m--){ 59 int a,b; 60 scanf("%d%d",&a,&b); 61 g[a].push_back(b); 62 } 63 find_scc(n); 64 for(int i=1;i<=scc_cnt;i++){ 65 to[i].clear(); 66 } 67 for(int u=1;u<=n;u++){ 68 for(int i=0;i<g[u].size();i++){ 69 int v=g[u][i]; 70 if(sccno[u]!=sccno[v])to[sccno[u]].push_back(sccno[v]); 71 } 72 } 73 memset(dp,0,sizeof dp); 74 ans=0; 75 for(int i=1;i<=scc_cnt;i++)ans=max(DP(i),ans); 76 printf("%d ",ans); 77 } 78 return 0; 79 }