vector<long long> topo_sort(const vector<vector<long long>> &G)
{ // bfs
    vector<long long> ans;
    long long n = (long long)G.size();
    vector<long long> ind(n); // ind[i]: 頂点iに入る辺の数(次数)
    for (long long i = 0; i < n; i++)
    { // 次数を数えておく
        for (long long next : G[i])
        {
            ind[next]++;
        }
    }
    queue<long long> que;
    for (long long i = 0; i < n; i++)
    { // 次数が0の点をキューに入れる
        if (ind[i] == 0)
            que.push(i);
    }
    while (!que.empty())
    { // 幅優先探索
        long long now = que.front();
        ans.push_back(now);
        que.pop();
        for (long long next : G[now])
        {
            ind[next]--;
            if (ind[next] == 0)
            {
                que.push(next);
            }
        }
    }
    return ans;
}
//DAGの最長パスの長さ(最長パスに使われる辺の数)を返す
long long long_path(const vector<vector<long long>> &G)
{
    long long n = G.size();
    vector<long long> topo = topo_sort(G);
    reverse(topo.begin(), topo.end());
    vector<long long> dp(n, 0);
    long long ret = 0;
    //後ろから更新していく
    for (long long i : topo)
    {
        for (long long j : G[i])
        {
            dp[i] = max(dp[i], dp[j] + 1);
        }
        ret = max(ret, dp[i]);
    }
    return ret;
}
    
    
© 2020 kacho65535