//経路復元付きBFS
//resizeを忘れないようにする
//s->tの経路が存在しないのにrestore関数を呼び出したときの挙動は未定義です
vector<vector<long long>> G;
vector<long long> preview;
//始点startからX回以内の移動でたどりつける頂点の最短距離を求める(到達できないなら-1)
void bfs(vector<long long> &dist, long long X, long long start)
{
    queue<long long> que;
    dist[start] = 0;
    preview[start] = -1;
    que.push(start);
    while (!que.empty())
    {
        long long v = que.front();
        que.pop();
        if (dist[v] == X)
            continue;
        for (auto next_v : G[v])
        {
            if (dist[next_v] != -1)
                continue;
            preview[next_v] = v;
            dist[next_v] = dist[v] + 1;
            que.push(next_v);
        }
    }
}
//BFS後、頂点xへの最短経路のうち1つを復元する(0-indexedかつ0番目からstart->endの順にindexを格納)
vector<long long> restore(long long x)
{
    vector<long long> ret;
    for (long long i = x; i != -1; i = preview[i])
    {
        ret.push_back(i);
    }
    reverse(ret.begin(), ret.end());
    return ret;
}
    
    
© 2020 kacho65535