https://www.acmicpc.net/problem/14588
어떠한 선분과 선분의 관계를
2차원 배열로 만들어서 표현할 수 있겠다고 생각했습니다.
그래서 우선 거리가 1인 친구 즉 맞닿아 있는 친구를 테이블로 작성하고
그 후에 플로이드를 통해서 모든 관계에서의 최단 거리를 구했습니다.
코드입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | #include <iostream> #include <string.h> #include <queue> #include <algorithm> using namespace std; #define ll long long #define MOD (ll)1e15 #define MAX_SIZE (int)1e5 #define mp make_pair #define INF 987654321 #define pii pair<int, int> //ios::sync_with_stdio(false); cin.tie(0); int dist[300][300]; vector<pii> v; bool f(int a, int b) { if (v[a].second < v[b].first || v[b].second < v[a].first) return 0; return 1; } int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin >> n; for (int i = 0; i < n; i++) { int a, b; cin >> a >> b; v.push_back(mp(a, b)); } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (i == j) continue; else dist[i][j] = INF; } } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (i == j) continue; if (f(i, j)) { dist[i][j] = 1; dist[j][i] = 1; } } } for (int k = 0; k < n; k++) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (dist[i][j] > dist[i][k] + dist[k][j]) { dist[i][j] = dist[i][k] + dist[k][j]; } } } } int q; cin >> q; for (int i = 0; i < q; i++) { int a, b; cin >> a >> b; a--, b--; cout << (dist[a][b] == INF ? -1 : dist[a][b]) << '\n'; } return 0; } | cs |
'알고리즘 > 최단 거리' 카테고리의 다른 글
[1686] 복날 (0) | 2017.07.12 |
---|---|
[1507] 궁금한 민호 (0) | 2017.07.08 |