#include #include #include #include #define vpii vector > #define vvi vector > using namespace std; int bfs(int i, vpii &bounds, vvi &dist, vector &rights, int K) { pair start = make_pair(i, bounds[i].first); queue > Q; Q.push(start); while(!Q.empty()) { pair hf = Q.front(); Q.pop(); if (rights[hf.first] == hf.second) { return dist[hf.first][hf.second]; } //cout << hf.first << " " << hf.second << ": " << dist[hf.first][hf.second] << endl; if (dist[hf.first][hf.second] + 1 < dist[hf.first][hf.second + 1]) { dist[hf.first][hf.second + 1] = dist[hf.first][hf.second] + 1; Q.push(make_pair(hf.first, hf.second + 1)); } if (hf.first != K - 1 && dist[hf.first][hf.second] + 1 < dist[hf.first + 1][hf.second] ) { dist[hf.first + 1][hf.second] = dist[hf.first][hf.second] + 1; Q.push(make_pair(hf.first + 1, hf.second)); } if (hf.first != 0 && dist[hf.first][hf.second] + 1 < dist[hf.first - 1][hf.second] ) { dist[hf.first - 1][hf.second] = dist[hf.first][hf.second] + 1; Q.push(make_pair(hf.first - 1, hf.second)); } } return INT_MAX; } int main() { ios::sync_with_stdio(false); int N; cin >> N; for(int NI = 0; NI < N; ++NI) { int K; cin >> K; vector rights; rights.resize(K + 1); vector > prev; prev.resize(K + 1); int maxB = 0; for(int KI = 0; KI < K; ++KI) { int l, r; cin >> l >> r; if (r > maxB) maxB = r; prev[KI] = make_pair(l,r); rights[KI] = r; } vector > dist; dist.resize(K); for(int i = 0; i < K; ++i) { dist[i].resize(maxB + 1); dist[i][prev[i].first] = 0; for(int j = prev[i].first + 1; j < prev[i].second + 1; ++j) { dist[i][j] = j - prev[i].first + 1; } } int min = INT_MAX; for(int i = 0; i < K; ++i) { int m = bfs(i, prev, dist, rights, K); if (m < min) min = m; } cout << "K prechodu reky je treba " << min << " pontonu." << endl; } return 0; }