[백준] 16940번 BFS 스페셜 저지 (C++)

2025. 8. 14. 17:26·Algorithm
728x90

https://www.acmicpc.net/problem/16940

 

 

이 문제는 그래프의 관계가 주어지고 노드 1부터 시작하여 입력된 순서대로 나올 수 있는지 여부를 출력하는 문제이다.

즉 1번 테스트 케이스를 보면

1 -> 2

1 -> 3

2 -> 4

의 관계가 주어졌을때

1부터 확장한다면 나올 수 있는 순서가

1, 2, 3, 4

1, 3, 2, 4가 나오게 된다.

이외에는 bfs를 수행했을때 나올 수 없는 순서이다.

 

 

따라서 입력된 순서를 기준으로 간선들을 정렬해 주었다.

예를 들어 1번 테케에서

간선의 입력 순서가

1 -> 3

1 -> 2

2 -> 4

가 되고 

나올 수 있는 순서가 1, 2, 3, 4로 입력이 된다고 가정한다면

 

1번 간선에는 3, 2가 저장이 될 것이다

이것을 입력된 순서로 정렬한다면

 1번 간선에는 2, 3순으로 저장이 된다.

따라서 정렬 한 후 1번 노드에서 bfs를 수행한 후 입력된 순서와 맞는지 비교하고 아닐 경우 0을 출력하였다.

 

정답 코드

#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
#define endl "\n"
#define MAX 1e9

struct coordinate {
    int x;
    string s;
    vector<int> v;
};

int dx[] = {-1, 0, 1, 0, 1, -1, -1, 1};
int dy[] = {0, 1, 0, -1, -1, 1, -1, 1};
int N;
vector<vector<int>> v(100001);
bool visited[100001];
int order[100001];
int bfs_order[100001];

bool cmp(int a, int b) {
    return order[a] < order[b];
}

void bfs(int a) {
    queue<int> q;
    q.push(a);
    visited[a] = true;
    int idx = a;

    while(!q.empty()) {
        int x = q.front();
        q.pop();

        bfs_order[x] = idx++;

        for(auto it : v[x]) {
            if(!visited[it]) {
                q.push(it);
                visited[it] = true;
            }
        }
    }
}

void solve() {
    bfs(1);

    bool isflag = false;
    for(int i = 1; i <= N; i++) {
        if(order[i] != bfs_order[i]) {
            isflag = true;
            break;
        }
    }


    if(!isflag) {
        cout << 1;
    }
    else cout << 0;
}

void input() {
    cin >> N;

    for(int i = 0; i < N-1; i++) {
        int a, b;
        cin >> a >> b;
        v[a].push_back(b);
        v[b].push_back(a);
    }

    for(int i = 1; i <= N; i++) {
        int a;
        cin >> a;
        order[a] = i;
    }

    for(int i = 1; i <= N; i++) {
        sort(v[i].begin(), v[i].end(), cmp);
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

    input();
    solve();
}

 

 

728x90
저작자표시 (새창열림)

'Algorithm' 카테고리의 다른 글

[백준] 18234번 당근 훔쳐 먹기 (C++)  (0) 2025.08.16
[백준] 22865번 가장 먼 곳 (C++)  (0) 2025.08.15
[백준] 1766번 문제집 (C++)  (0) 2025.08.13
[백준] 20955번 민서의 응급 수술 (C++)  (0) 2025.08.12
[백준] 15900번 나무탈출 (C++)  (0) 2025.08.11
'Algorithm' 카테고리의 다른 글
  • [백준] 18234번 당근 훔쳐 먹기 (C++)
  • [백준] 22865번 가장 먼 곳 (C++)
  • [백준] 1766번 문제집 (C++)
  • [백준] 20955번 민서의 응급 수술 (C++)
쿨쿨.
쿨쿨.
  • 쿨쿨.
    All of the life
    쿨쿨.
  • 전체
    오늘
    어제
    • 분류 전체보기 (286) N
      • Programming (53) N
        • C, C++ (18)
        • Python (6)
        • Java (1)
        • HTML,CSS,JS (3)
        • SQL(DB) (13)
        • SpringBoot (9) N
        • Android (2)
        • CI,CD (1)
      • Algorithm (173)
        • Review (4)
      • Security (14)
        • WebHacking (3)
        • Websecurity (11)
      • OS (19)
        • Linux (12)
        • Mac os (2)
      • 머신러닝 (1)
      • CS(Computer Science) (12)
        • 컴퓨터 네트워크 (3)
        • 컴퓨터 구조 (1)
        • 인공지능 (8)
      • Docker (2) N
      • Dev Book Review (3)
        • Clean Code (1)
        • Effective Java (0)
        • Real MySQL (2)
      • SWM (1)
      • Review (6)
      • AWS (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    깊이우선탐색
    Leviathan
    누적합
    WebSecurity
    그리디
    브루트포스
    우선순위큐
    DP
    linux
    에라토스테네스의 체
    정렬
    구현
    코딩
    DFS
    이분탐색
    그래프 이론
    비트마스킹
    c언어
    wargame
    투포인터
    백준
    백트래킹
    Bandit
    BFS
    트리
    다이나믹 프로그래밍
    재귀
    시뮬레이션
    다익스트라
    우선순위 큐
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.6
쿨쿨.
[백준] 16940번 BFS 스페셜 저지 (C++)
상단으로

티스토리툴바