[BOJ, C++]#1976_여행 가자, BFS, 그래프 탐색

2024. 9. 24. 16:09· 문제 풀이/BOJ 문제 풀이
목차
  1. #1. 문제
  2. #2. 풀이
  3. 1. BFS
  4. 2. 시작 정점을 기준으로 BFS 수행, 그리고 방문 여부 체크!
  5. #3. 코드

#1. 문제

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

 


 

#2. 풀이

 

1. BFS

 

[자료구조]#6_그래프

#0. 개념 1. 그래프?[정의] : 그래프는 노드와 간선들의 집합으로 이루어진 비 선형 자료구조입니다. 그래프의 노드들은 간선을 통해 연결되어 일종의 네트워크를 형성합니다. 그래프는 노드와

webddevys.tistory.com

BFS는 그래프의 모든 정점을 탐색하는 방법 중 하나로, 인접한 정점들을 우선 탐색하는 방법입니다. 일반적으로, BFS는 큐 자료구조를 활용하여 구현됩니다.

 

2. 시작 정점을 기준으로 BFS 수행, 그리고 방문 여부 체크!

  1. 먼저, 주어진 경로의 시작 정점으로부터 BFS를 수행합니다. 이때, 방문한 정점들에 대하여 방문 여부를 체크해 줍니다.
  2. 주의할 점으로 "같은 도시를 여러 번 방문해도 된다"는 의미를 오해하면 안 됩니다. 어떠한 정점에 대하여 방문 여부 체크하면 해당 정점을 다시 방문 못하는 거 아니야?라고 오해할 수 있습니다. 다만, BFS를 통해 현재 정점에 인접한 가능한 모든 경로에 대하여 첫 방문에 이미 탐색을 진행했다는 의미로 해석해야 합니다.
  3. 그리고, 경로 상의 도시들에 대하여 방문 여부를 체크하고, 모두 방문했다면 "YES", 방문하지 않았다면 "NO"를 출력해 줍니다.

 


 

#3. 코드

@@ -0,0 +1,95 @@
/*
    @링크: https://www.acmicpc.net/problem/1976
*   @문제: 여행 가자
*   @설명
        1. BFS 활용
        2. 같은 도시를 여러 번 방문해도 된다 -> 이미 방문한 도시의 방문 여부를 체크하지 않아도 된다 (X)
        3. BFS를 통해 특정 정점을 방문했다면, 해당 도시로부터 가능한 모든 경로에 대하여 '이미' 탐색이 진행중이다.
           따라서, 같은 도시를 여러번 방문해도 된다는 다시 말해 특정 정점을 경유하는 모든 경로를 통해 도착 정점에만
           도착하면 된다!라는 의미이다. 방문 여부 체크는 단순히 같은 작업을 반복하지 않기 위해서다!
          
*/


#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

typedef pair<int,int> p;

int N, M;
vector<vector<int>> cities;
vector<int> travel;

void bfs()
{
    vector<bool> visited(N+1, false);
    queue<int> q;

    q.push(travel.front());
    visited[travel.front()] = true;

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

        for(int i=1; i<=N; ++i)
        {
            if(cities[cur][i] != 0 && !visited[i])
            {
                visited[i] = true;
                q.push(i);
            }
        }
    }

    for(int i=0; i<M; ++i)
    {
        if(!visited[travel[i]])
        {
            cout << "NO";
            return;
        }
    }

    cout << "YES";

}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin >> N;

    //@resize
    cities.resize(N+1, vector<int>(N+1));

    cin >> M;

    travel.resize(M);

    //@도시 연결 여부
    for(int i=1; i<=N; ++i)
    {
        for(int j=1; j<= N; ++j)
        {
            cin >> cities[i][j];
        }
    }

    //@여행 계획
    for(int i=0; i<M; ++i)
    {
        cin >> travel[i];
    }

    bfs();

    return 0;
}

 


 

 

 

 

저작자표시 (새창열림)

'문제 풀이 > BOJ 문제 풀이' 카테고리의 다른 글

[BOJ, C++]#1854_K번째 최단경로 찾기, 다익스트라, 길 찾기 알고리즘, 최단 경로 알고리즘, 단일-출발 최단 경로  (0) 2024.10.03
[BOJ, C++]#K진 트리, 완전 이진 트리, LCA, 완전 이진 트리의 부모, 완전 이진 트리의 자식  (0) 2024.09.26
[BOJ, C++]#1368_물 대기, 최소 스패닝 트리, 최소 신장 트리, 크루스칼, 최소 신장 트리의 가상 노드, 가상 노드 활용  (0) 2024.09.20
[BOJ, C++]#2644_촌수 계산, BFS, 최단 경로, 길 찾기, 무 방향 그래프, 동일 가중치 최단 경로  (0) 2024.09.20
[BOJ, C++]#14426_접두사 찾기, 검색 트리, Trie 자료 구조, Trie 검색 트리, 트리  (0) 2024.09.12
  1. #1. 문제
  2. #2. 풀이
  3. 1. BFS
  4. 2. 시작 정점을 기준으로 BFS 수행, 그리고 방문 여부 체크!
  5. #3. 코드
'문제 풀이/BOJ 문제 풀이' 카테고리의 다른 글
  • [BOJ, C++]#1854_K번째 최단경로 찾기, 다익스트라, 길 찾기 알고리즘, 최단 경로 알고리즘, 단일-출발 최단 경로
  • [BOJ, C++]#K진 트리, 완전 이진 트리, LCA, 완전 이진 트리의 부모, 완전 이진 트리의 자식
  • [BOJ, C++]#1368_물 대기, 최소 스패닝 트리, 최소 신장 트리, 크루스칼, 최소 신장 트리의 가상 노드, 가상 노드 활용
  • [BOJ, C++]#2644_촌수 계산, BFS, 최단 경로, 길 찾기, 무 방향 그래프, 동일 가중치 최단 경로
Hardii2
Hardii2
개발 블로그Hardii2 님의 블로그입니다.
Hardii2
개발 블로그
Hardii2
전체
오늘
어제
  • 분류 전체보기
    • 알고리즘
    • 웹 개발
      • Node.js
      • React
    • 게임개발
      • DirectX12
      • 관련 지식
      • Unreal C++
      • Unreal 블루프린트
    • 언어
      • Effective C++
      • Basic C++
      • 디자인 패턴
      • 자료구조
      • 기술 질문
    • 문제 풀이
      • BOJ 문제 풀이
      • Programmers 문제 풀이
      • geeksForgeeks 문제 풀이
    • 수학
      • 확률과 통계
      • 게임수학
    • 개인프로젝트
    • 그룹프로젝트
      • PM
      • Dev
    • Github

블로그 메뉴

  • 홈
  • 글쓰기

공지사항

인기 글

태그

  • set
  • unreal
  • 기술 질문
  • 그래프
  • programmers
  • 트리
  • dfs
  • 디자인 패턴
  • DP
  • C++
  • 최단 경로
  • 개발
  • 알고리즘
  • BOJ
  • stl
  • Unreal Blueprint
  • Effective C++
  • BFS
  • 우선순위 큐
  • 정렬

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
Hardii2
[BOJ, C++]#1976_여행 가자, BFS, 그래프 탐색
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.