WFとか。
range[i]が頂点の数より大きくなる場合がある。
(i - range[i] + V) % Vだと負になったりする。
class TravelOnMars { public: int minTimes(vector <int> range, int startCity, int endCity) { const int N = range.size() + 10; int g[N][N]; const int inf = 1 << 28; fill(&g[0][0], &g[N - 1][N - 1] + 1, inf); const int M = range.size(); for (int i = 0; i < M; ++i) { for (int j = -range[i]; j <= +range[i]; ++j) { int k = (i + j + M * M) % M; g[i][k] = 1; } } for (int k = 0; k < N; ++k) { for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { g[i][j] = min(g[i][j], g[i][k] + g[k][j]); } } } return g[startCity][endCity]; }