2593 Elevator BFS DP
N층짜리 건물에서 주어진 수열의 층에서만 멈추는 엘레베이터가 M대 있을 때
A층에서 B층까지 가기 위해 최소한으로 갈아타는 엘레베이터의 수 & 내렸던 층을 구한다.
트래킹때문에 좀 복잡했던 문제같음..
더보기
현재 층 curf에서 탈 수 있는 엘레베이터 cure
cure에서 내릴 수 있는 다음 층 nxtf
nxtf가 B와 같다면 종료
다르다면 nxtf를 큐에 넣고 다음 엘레베이터 nxte로 갈아타며 dp를 업데이트
// Initiate
for (int e : f[A]) dp[A][e] = { 1,0 };
Q.push(A);
// BFS and Get Ans
bool arrived_at_B = false;
while (!Q.empty()) {
arrived_at_B = false;
int curf = Q.front(); Q.pop();
for (int cure : f[curf]) {
cnt = dp[curf][cure].first;
//cure로 갈 수 있는 층 nxtf
int k = E[cure].second;
for (int nxtf = E[cure].first; nxtf <= N; nxtf += k) {
if (nxtf == curf || dp[nxtf][cure].first) continue;
dp[nxtf][cure] = { cnt,curf };
if (nxtf == B) {
S.push({ B,cure }); arrived_at_B = true; break;
}
Q.push(nxtf);
//nxtf에서 갈아탄 nxte
for (int nxte : f[nxtf]) {
if (nxtf == curf || dp[nxtf][nxte].first) continue;
dp[nxtf][nxte] = { cnt + 1, curf };
}
}
if (arrived_at_B) break;
}
if (arrived_at_B) break;
}
BFS에서 pair<int,int>를 썼었다가 int만 써도 해결할 수 있음을 알았다.
16946 벽 부수고 이동하기 4 BFS DFS Disjoint Set(?)
현재 위치의 상하좌우에 위치한 벽을 부쉈을 때 움직일 수 있는 칸의 수를 구하는 문제
BFS로 구간 구해서 동서남북 잘 더해주면 된다.
예전에 틀려서 방치해두다가 틀린 문제 고쳤다.
16724 피리부는 사나이 DFS Disjoint Set
움직임을 계속하다보면 도는 구간만 돌게 되는데 그 구간의 개수를 찾는 문제
1948 임계경로 위상정렬
시작점에서 도착점까지 모든 경로를 거쳐 가면서 가장 오래 걸리는 길을 찾는다.
초반에 다익스트라로 생각했다가 틀렸습니다 맞고 찾아보니 위상정렬,,,,
더보기
Q.push(D);
while (!Q.empty()) {
int cur = Q.front(); Q.pop();
for (edge e : E[cur]) {
int cost = maxcost[cur] + e.c;
if (cost > maxcost[e.v]) maxcost[e.v] = cost, from[e.v].clear();
if (cost == maxcost[e.v]) from[e.v].push_back(cur);
ind[e.v]--;
if (!ind[e.v]) Q.push(e.v); //위상정렬
}
}
'Probelm Solving > Notes' 카테고리의 다른 글
그리디 (2) (1) | 2021.05.31 |
---|---|
그리디 (1) (0) | 2021.05.03 |
KMP DP 트리 그래프 기하학 최근 푼 문제 (0) | 2021.04.16 |
구현 (2) 지난 주 푼 문제 (0) | 2021.04.05 |
그래프 (1) 최근 푼 문제 (0) | 2021.03.15 |
댓글