본문 바로가기
Probelm Solving/Notes

그래프 (1) 최근 푼 문제

by garrrruii 2021. 3. 15.

아니,,블로그 정리를 어떻게 해야할지 모르겠다.

 

15559 내 선물을 받아줘

15886 내 선물을 받아줘2

2536 버스 갈아타기

5214 환승

 


15559 내 선물을 받아줘 → union find (Disjoint Set)

15886 내 선물을 받아줘2 → 문자열 내 EW의 개수

 

 

 

 


2536 버스 갈아타기 → BFS

가로/세로로 움직이는 버스를 나누어

갈아탈 수 있는 버스를 찾아내는 방법을 생각해낼 것

 

 

 

bfs

더보기

 

ver[N] ver[ i ] = x=i에서 세로로 움직이는 버스들 저장

hor[N] hor[ i ] = y=i에서 가로로 움직이는 버스들 저장

vis[N] vis[ i ] = i번째 버스를 타기까지 갈아탄 최소 횟수 

int bfs() {
    // STEP 1. 시작점을 포함하는 버스
    for (info b : ver[SX]) {
        if (b.s <= SY && SY <= b.e) vis[b.n] = 1, Q.push(b.n);
    }
    for (info b : hor[SY]) {
        if (b.s <= SX && SX <= b.e) vis[b.n] = 1, Q.push(b.n);
    }

    // STEP 2. BFS
    while (!Q.empty()) {
        int cur = Q.front(); Q.pop();

        int x1 = B[cur].x1, y1 = B[cur].y1;
        int x2 = B[cur].x2, y2 = B[cur].y2;

        if (y1 == y2) {
        //IF) Horizontal - 교차하는 Vertical or 겹치는 Horizontal
            if (y1 == DY && DX >= x1 && DX <= x2) return vis[cur];
            
            for (int x = x1; x <= x2; ++x)
                for (info b : ver[x]) {
                    if (vis[b.n] || y1 < b.s || y1 > b.e) continue;
                    
                    vis[b.n] = vis[cur] + 1; Q.push(b.n);
                }
            for (info b : hor[y1]) {
                if (vis[b.n] || x2 < b.s || x1 > b.e) continue;
                
                vis[b.n] = vis[cur] + 1; Q.push(b.n);
            }
        }
        else {          
        //IF) Vertical - 교차하는 Horizontal or 겹치는 Vertical 
            if (x1 == DX && DY >= y1 && DY <= y2) return vis[cur];
            
            for (int y = y1; y <= y2; ++y) {
                for (info b : hor[y]) {
                    if (vis[b.n] || x1 < b.s || x1 > b.e) continue;

                    vis[b.n] = vis[cur] + 1; Q.push(b.n);
                }
            }
            for (info b : ver[x1]) {
                if (vis[b.n] || y2 < b.s || y1 > b.e) continue;

                vis[b.n] = vis[cur] + 1; Q.push(b.n);
            }
        }
    }
}

 


5214 환승 → BFS

hypertube를 vertex로 생각

 

 

 

 

 

'Probelm Solving > Notes' 카테고리의 다른 글

KMP DP 트리 그래프 기하학 최근 푼 문제  (0) 2021.04.16
구현 (2) 지난 주 푼 문제  (0) 2021.04.05
기하학 (2) 계산 문제들  (0) 2021.03.15
구현 (1)  (0) 2021.01.29
기하학 (1) 고등수학 재밌다.  (4) 2021.01.19

댓글