WA on Subtask #1
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=300005;
vector<int>g[N];
vector<int>ne[N];
int cnt,idx,n,m;
int dfn[N],low[N],scc[N],dis[N],jzh[N],u[N],v[N];
bool vis[N];
stack<int>t;
void dfs(int x){
dfn[x]=++cnt;
low[x]=dfn[x];
t.push(x);vis[x]=1;
for(auto v:g[x]){
if(!dfn[v]) dfs(v),low[x]=min(low[x],low[v]);
else if(vis[v]) low[x]=min(low[x],dfn[v]);
}
if(low[x]==dfn[x]){
++idx;
while(1){
auto ts=t.top();t.pop();
vis[ts]=0;
scc[ts]=idx;
jzh[idx]++;
if(ts==x)break;
}
}
}
void spfa(){
queue<int>q;
q.push(scc[1]);
vis[scc[1]]=1;
while(q.size()){
auto u=q.front();q.pop();
// cout<<u<<"\n";
vis[u]=0;
for(auto v:ne[u]){
if(dis[v]<dis[u]+jzh[v]){
dis[v]=dis[u]+jzh[v];
if(!vis[v])q.push(v),vis[v]=1;
}
}
}
cout<<dis[scc[1]+idx];
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>m;
while(m--){
int u,v;
cin>>u>>v;
g[u].push_back(v);
}
for(int i=1;i<=n;i++) if(!dfn[i]) dfs(i);
for(int i=1;i<=idx;i++) jzh[i+idx]=jzh[i];
for(int i=1;i<=n;i++){
for(auto v:g[i]){
if(scc[i]!=scc[v]){
ne[scc[i]].push_back(scc[v]);
ne[scc[v]].push_back(scc[i]+idx);
ne[scc[i]+idx].push_back(scc[v]+idx);
}
}
}
spfa();
return 0;
}