참 간단해 보이는데 생각보다 생각을 오래 한 문제
조건이 몇가지 존재 했다.
첫번째로는 N이 10000이기에 인접행렬을 사용하게 되면 10000 10000 4 byte를 사용. 메모리 초과가 나온다.
두번째로는 A가 B를 신뢰한다에서 단방향 그래프라는 것인데, B 가 A의 부모 정도로 생각하면 간단했다.
세번째로는 M이 100,000 이기에 Queue의 크기를 10만으로 잡은 원형 큐를 하나 사용했다.
첫번째 조건은 가변배열을 사용 해야만 하는 조건이었기에 평소와는 다르게 vector를 사용해서 해결했다.
#include <iostream>
#include <vector>
using namespace std;
vector<int> childs[10001];
int childcount[10001];
int mqueue[100001];
int top = 0;
int bot = 0;
void push(int x)
{
mqueue[top++%(100000)] = x;
}
int pop() {
return mqueue[bot++% (100000)];
}
bool isempty() {
return (top% (100000)) == (bot% (100000));
}
int main()
{
int n, m;
int max = 0;
cin >> n >> m;
for (int i = 0; i < m; i++)
{
int a, b;
cin >> a >> b;
childs[b].push_back(a);
}
for (int i = 1; i < n + 1; i++)
{
push(i);
bool check[10001]; // 탐색을 했는지 확인
bool isadded[10001]; // 현재 노드가 이미 추가된 노드인지 확인
fill_n(check, n + 1, false);
fill_n(isadded, n + 1, false);
isadded[i] = true; // 현재 노드는 추가한 것으로 판정
while (!isempty())
{
int cur = pop();
if (check[cur])
continue;
check[cur] = true;
for (int j = 0; j < childs[cur].size(); j++)
{
int idx = childs[cur][j];
if (!isadded[idx])
{
push(idx);
childcount[i]++;
isadded[idx] = true;
}
}
}
}
for (int i = 1; i < n +1; i++)
if (max < childcount[i])
max = childcount[i];
for (int i = 1; i < n + 1; i++)
if (max == childcount[i])
cout << i << " ";
return 0;
}
2018-12-31 16:02:18에 Tistory에서 작성되었습니다.