본문 바로가기

Algorithm

C++(씨쁠쁠)(cplusplus)-백준(baekjoon)(BaekJoon)코딩 1325번:효율적인 해킹(BFS) 답

반응형
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
//가장 많이 연결되어 있는 간선을 가지고 있는 점을 찾아야 한다.
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
int n, m,u,v,c[10001],d[10001];//각 정점에 연결된 간선의 개수가 몇인지 저장하는
 
vector <int> a[10001];
vector <int> p(10001);//가장 많은 간전을 가지고 있는 점을 저장함
void BFS(int x)
{
    queue <int> q;
    q.push(x);
    while (!q.empty())
    {
        int x = q.front();
        q.pop();
        c[x] = 1;
        for (int i = 0; i < a[x].size(); i++)
        {
            int y = a[x][i];
            if (c[y] == 0)
            {
                q.push(y);
                c[y] = 1;
                d[y]++;
            }
        }
    }
}
int main() {
    int big = 0,k=1;
    cin >> n >> m;
    while (m--)
    {
        cin >> u >> v;
        a[u].push_back(v);//단방향 그래프이기 때문
    }
    for (int i = 1; i <= n; i++)
    {
        for (int i = 1; i <= n; i++)
            c[i] = 0;//체크한 정점 초기화
        BFS(i);//단방향이므로 모든 정점에 대해서 BFS필요
    }
    for (int i = 1; i <= n; i++)
        if (d[i] > big)//가장 많은 간전을 저장한 수를 저장
            big = d[i];
    for (int i = 1; i <= n; i++)
    {
        if (big == d[i])
        {
            p[k++= i;//big과 같은 점을 저장
        }
    }
    sort(p.begin(), p.begin() + n);//점을 정렬
    for (int i = 1; i <= n; i++)//오른차순으로 출력
        if(p[i]!=0)
            cout << p[i] << ' ';
}
cs