Problem Solving/BOJ

[백준 11403번] [DFS] 경로 찾기

  • -
728x90
반응형

Approach

처음에는 DFS를 돌 되, 스택을 활용해서 자신보다 밑에 있는 element 들은 방문할 수 있다는 점을 활용해서 component별로 처리하려고 했는데 사이클이 존재할 수 있는 측면때문에 실패하였다. 물론 코드를 잘(?) 짜면 가능할 것 같기도 하다.

 

기본적인 접근 방법은 모든 노드들에 대해서 dfs를 돌면서, 방문할 수 있는 노드를 찾아나가면 된다.

다만, 유의할 지점이 사이클이 존재할 수 있기 때문에 자기 자신으로 돌아오는 간선이 있으면 따로 체크해주어야 한다.

Code

#include <bits/stdc++.h>
#define fastio ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0)

using namespace std;
int r[100][100];
int result[100][100];
int visited[100];
int n;
vector<int> v;
int cur;
bool flag;

void dfs(int x){
    visited[x] = 1;
    v.push_back(x);
    for(int i = 0; i < n; i++){
        if(!visited[i] && r[x][i] == 1) dfs(i);
        if(r[x][i] == 1 && i == cur) flag = true;
    }

    return;
}

int main(void){
    fastio;
    memset(result, 0, sizeof(result));
    memset(visited, 0, sizeof(visited));

    cin >> n;
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            cin >> r[i][j];
        }
    }

    for(int i = 0; i < n; i++){
        v.clear();
        memset(visited, 0, sizeof(visited));
        cur = i;
        flag = false;
        dfs(i);
        if(flag) result[i][i] = 1;
        for(int j = 1; j < v.size(); j++){
            result[i][v[j]] = 1;
        }       
    }

    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            cout << result[i][j] << " ";
        } 
        cout << "\n";
    }
    
    return 0;
}
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.