#line 1 "Main.cpp" #include #include #line 2 "nachia\\set\\dsu.hpp" #line 5 "nachia\\set\\dsu.hpp" namespace nachia { struct Dsu{ private: std::vector w; public: Dsu(int n) : w(n, -1) {} int leader(int u){ if(w[u] < 0) return u; return w[u] = leader(w[u]); } int merge(int u, int v){ u = leader(u); v = leader(v); if(u == v) return u; if(-w[u] < -w[v]) std::swap(u, v); else if(w[u] == w[v]) w[u]--; w[v] = u; return u; } bool same(int u, int v){ return leader(u) == leader(v); } }; } // namespace nachia #line 6 "Main.cpp" namespace nachia{ struct MergerTree{ std::vector parent; std::vector weight; int node_count = 0; MergerTree(int n, std::vector> edges){ Dsu dsu(n); std::vector root(n); for(int i=0; i getAllDepth() const { std::vector res(node_count, 0); for(int i=node_count-1; i>=0; i--) if(parent[i] != -1) res[i] = res[parent[i]] + 1; return res; } }; } // namespace nachia #include #include #line 54 "Main.cpp" #include #include using namespace std; using i32 = int32_t; using u32 = uint32_t; using i64 = int64_t; using u64 = uint64_t; #define rep(i,n) for(int i=0; i<(int)(n); i++) using Modint = atcoder::static_modint<998244353>; int main(){ int N, M; cin >> N >> M; vector> E(M); rep(i,M){ int u,v; cin >> u >> v; u--; v--; E[i] = {u,v}; } reverse(E.begin(), E.end()); nachia::MergerTree mt(N, E); auto d = mt.getAllDepth(); int ans = *max_element(d.begin(), d.end()); cout << ans << '\n'; return 0; } struct ios_do_not_sync{ ios_do_not_sync(){ std::ios::sync_with_stdio(false); std::cin.tie(nullptr); } } ios_do_not_sync_instance;