티스토리 뷰
https://www.acmicpc.net/problem/1939
1939번: 중량제한
첫째 줄에 N, M(1 ≤ M ≤ 100,000)이 주어진다. 다음 M개의 줄에는 다리에 대한 정보를 나타내는 세 정수 A, B(1 ≤ A, B ≤ N), C(1 ≤ C ≤ 1,000,000,000)가 주어진다. 이는 A번 섬과 B번 섬 사이에 중량제한이
www.acmicpc.net
다리들의 관계를 vector<pair<int,int>>>bridge[10001] 에 저장해 줬다.
bridge[a] = pair(b, c) 라면 a 섬과 b섬 사이의 다리의 중량제한이 c다.
양방향이므로 a,b,c가 주어질때 a에서 b와 b에서 a 두 경우 모두 c로 저장해줘야 한다.
left = 0, right는 모든 다리들의 중량중 최댓값으로 하고 이분탐색한다.
mid가 되는 중량에 대하여 하나의 공장에서 다른 공장으로 이동할수 있는지 탐색하면 되는데
처음에 dfs로 했다가 시간초과를 받아서 bfs 로 풀어 정답 처리 받았다.
시간을 줄이기 위해 두번째 공장에 도착하면 바로 true를 리턴해줘야 한다.
2023.03.19
다시 풀어봤다.
이 문제는 그냥 처음에 봤을때는 dfs나 bfs 돌려서 시작지점 부터 도착지점까지 물건을 옮겼을때 가장 중량이 큰 물건을 구하면 될것같다.
하지만 문제는, 문제에서 두 노드 사이에 중복된 경로가 주어질수 있다고 명시되어 있기 때문에, 하나의 노드에서 다른 노드로 이동할때 가중치가 가장 큰 경로를 선택해서 이동해야 한다.
여기서 문제가 발생하는데 이렇게 되면 다음 노드로 이동할때마다 가중치가 가장 큰 경로를 탐색해야 한다.
2차원 배열로 최대 가중치 값을 미리 저장해 놓는다고 해도, 10000*10000*sizeof(int) = 4억 byte = 400mb 로 메모리가 초과된다.
나는 일단 입력을 모두 받은 후에, 하나의 노드에서 다른 노드로 가는 경로들 중 최댓값만을 선별해서 다시 저장해줬다.
그 후에는 bfs 돌리면 된다.
'PS' 카테고리의 다른 글
백준 1010. 다리 놓기 (0) | 2022.03.10 |
---|---|
백준 1300. K번째 수 (0) | 2022.03.09 |
백준 12015. 가장 긴 증가하는 부분수열2, 3 (0) | 2022.03.09 |
백준 2512. 예산 (0) | 2022.03.09 |
백준 2473. 세 용액 (0) | 2022.03.07 |
- Total
- Today
- Yesterday
- recursion
- DP
- C++
- priority queue
- db
- binary search
- MVC
- 이분탐색
- dfs
- CSS
- Stack
- Unity
- 재귀
- Kruskal
- 자료구조
- greedy
- two pointer
- back tracking
- Spring
- floyd warshall
- Brute Force
- permutation
- graph
- Tree
- Implementation
- Dijkstra
- BFS
- C
- Python
- 조합
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |