본문 바로가기
Probelm Solving/Notes

그래프 (2) 문제들

by garrrruii 2021. 4. 26.

 

 

 

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

댓글