백준알고리즘

효율적인 해킹

먼지의삶 2019. 9. 9. 00:06

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <cstdlib>

using namespace std;

int n, m;

vector<int> map[100001];

bool d[100001];

int cnt;



void dfs(int node)
{
    d[node] = true;
    
    for (int i = 0; i < map[node].size(); i++)
    {
        int next = map[node][i];
        if (!d[next])
        {
            cnt++;
            dfs(next);
        }
    }
}



int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> m;
    
    for (int i = 0; i < m; i++){
        int node1, node2;
        cin >> node1 >> node2;
        map[node2].push_back(node1);
    }
    
    int nodeCnt = 0;
    vector<int> result;
    
    for (int i = 1; i <= n; i++)
    {
        memset(d, false, sizeof(d));
        cnt = 0;
        dfs(i);
        if (nodeCnt == cnt)
            result.push_back(i);
        if (nodeCnt < cnt)
        {
            nodeCnt = cnt;
            result.clear();
            result.push_back(i);
        }
    }
    sort(result.begin(), result.end());
    for (int i = 0; i < result.size(); i++)
        cout << result[i] << " ";
    cout << endl;

    return 0;

}

 

DFS문제다.

BFS로하면 풀기힘들다.

간선벡터로 잡아놔서 Bool배열 초기화를시키기위해선 2차원으로 만들어야하는데

2차원배열 초기화시키는거 + 2차원배열왔다갔다하는거 하면 시간복잡도가 터지는모양이다.

그냥 1차원배열로 한큐에풀게 DFS로 풀어봤다.