Problem:
Score : 100 points

Problem Statement

There is a directed graph G with N vertices and M edges.
The vertices are numbered 1, 2, \ldots, N, and for each i (1 \leq i \leq M), the i-th directed edge goes from Vertex x_i to y_i.
G does not contain directed cycles.

Find the length of the longest directed path in G.
Here, the length of a directed path is the number of edges in it.

Constraints

All values in input are integers.

2 \leq N \leq 10^5

1 \leq M \leq 10^5

1 \leq x_i, y_i \leq N

All pairs (x_i, y_i) are distinct.

G does not contain directed cycles.

Input

Input is given from Standard Input in the following format:

N M
x_1 y_1
x_2 y_2
:
x_M y_M

Output

Print the length of the longest directed path in G.

Sample Input 1

4 5
1 2
1 3
3 2
2 4
3 4

Sample Output 1

3

The red directed path in the following figure is the longest:

Sample Input 2

6 3
2 3
4 5
5 6

Sample Output 2

2

The red directed path in the following figure is the longest:

Sample Input 3

5 8
5 3
2 3
2 4
5 2
5 1
1 4
4 3
1 3

Sample Output 3

3

The red directed path in the following figure is one of the longest:

Solution in C++ (GCC 9.2.1) (judge verdict: Wrong Answer)


#include <bits/stdc++.h>
#define int long long
#define pb push_back
using namespace std;
const int N = 2*1e5+10;
const int MOD = 1e9 + 7;
const int INF = 1e18 + 10;
int dp[N];

void printVector(vector<int> s){
    for(int &x:s){
        cout<<x<<" ";
    }
    cout<<endl;
}
vector<int> g[N];

int dfs(int cur){
    if(dp[cur]!=-1){
        return dp[cur];
    }
    for(auto x : g[cur]){
        dp[cur] = max(dp[cur] , dfs(x));   
    }
    return dp[cur];
}


void solve(){
    int n;
    int m;
    cin>>n;
    cin>>m;
    for(int i = 0 ; i < N ;  i++) dp[i]= -1;
    for(int i = 0 ; i <m ; i++){
        int n1;
        int n2;
        cin>>n1;
        cin>>n2;
        g[n1].pb(n2);
    }
    int ans = 0;
    for(int i = 1; i <=N ; i++){
        ans = max(ans , dfs(1));
    }
    cout<<ans<<endl;
    
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int t;
//    cin>>t;
    t = 1;
    for(int i = 0 ; i < t ; i++){
        solve();
    }
    return 0;
}