성우리뷰

DFS/BFS

두원공대88학번뚜뚜 2021. 9. 9. 12:57
#include <string>
#include <vector>

using namespace std;
#define MAX 210000000

void dfs(int dist, int dest, int cost[], bool g[][20001], int vert) {
    if(dest == 1) {
        cost[dest] = 0;
    }
    //출발지가 1이 아니면, 이미 왔던 곳이라면 dist가 더 클 땐 pass
    else if(cost[dest] > dist) {
        cost[dest] = dist;
    }
    else 
        return;
    
    for(int i =1; i<=vert; i++) {
        if(g[dest][i] != true)
            continue;
        dfs(dist+1, i, cost, g, vert);
    }
}

int solution(int n, vector<vector<int>> edge) {
    int answer = 0;
    bool g[20001][20001] = {false, };
    int cost[20001] = {0, };
    int vert = n;
    
    for(int i=1; i<=n; i++) {
        cost[i] = MAX;
    }
    for(int i=0; i<edge.size(); i++) {
        g[edge[i][0]][edge[i][1]] =true;
        g[edge[i][1]][edge[i][0]] =true;
    }
    
    dfs(0, 1, cost, g , vert);
    
    int mx=0;
    for(int i=1; i<=vert; i++) {
        mx = cost[i] > mx? cost[i] : mx;
    }
    for(int i=1; i<=vert; i++) {
        if(cost[i] == mx)
            answer++;
    }
    return answer;
}

//BFS방식

#include <string>
#include <vector>
#include <algorithm>
#include <queue>
#include <iostream>

using namespace std;
//#define MAX 210000000

int solution(int n, vector<vector<int>> edge) {
    int answer = 0;
    queue<int> q;
    
    bool g[20001][20001] = {false, };
    int cost[20001] = {0, };
    bool visit[20001] = {false, };
    
    //일단 edge를 오름차순으로 정렬
    //내림차순은 sort(edge.begin(), edge.end(), greater<>());
    sort(edge.begin(), edge.end());
    
    for(int i=0; i<edge.size(); i++) {
        g[edge[i][0]][edge[i][1]] =true;
        g[edge[i][1]][edge[i][0]] =true;
    }
    
    int mx=0;
    //1부터 시작
    q.push(1);
    visit[1] = true;
    
    while(!q.empty()) {
        int vert = q.front();
        q.pop();
        
        for(int i=2; i<=n; i++) {
            if(g[vert][i] == true && visit[i] != true) {
                q.push(i);
                visit[i] = true;
                cost[i] = cost[vert] + 1;
                
                //최대값 갱신
                if(cost[i] > mx) {
                    mx = cost[i];
                }
            }
        }
    }
    
    for(int i=1; i<=n; i++) {
        if(cost[i] == mx)
            answer++;
    }
    
    return answer;
}