티스토리 뷰

문제

https://www.acmicpc.net/problem/10451

풀이과정

순열 그래프에서 순열 사이클의 개수를 구하는 프로그램을 만드는 문제이다.
문제를 보면 dfs를 활용하는 기본적인 문제로 볼 수 있으며, 이제는 기본적으로 dfs를 구현할 줄 알게 됐고 실행이 잘 안되면 생각하며 고쳐갈 수 있게 되었다.

문제는 dfs로 탐색을 하며 끊어지는 부분이 나오면 개수를 하나씩 추가하는 식으로 풀었다.

이차원 벡터와 chk[]를 int형으로 두고 풀었는데 굳이 이차원 벡터를 쓸 필요도 없을 것 같고 chk[]는 bool형으로 쓰는 게 더 가독성이 높을 것 같다. 다음에 dfs 문제를 풀 때는 bool형으로 써야겠다.

그리고 fiil() 함수를 통해 벡터를 다시 0으로 초기화 해주고 memset()을 이용해 chk[]도 초기화 해주었는데 벡터를 초기화 하는 것은 굳이 필요없는 것 같다.

소스코드

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

using namespace std;

int T, N;
vector<int> a[1001];
int chk[1001];
int ans;

void dfs(int node)
{
    chk[node] = 1;
    //cout << node << " ";
    for (int i = 0; i < a[node].size(); i++)
    {
        int next = a[node][i];
        if (chk[next] != 1)
        {
            dfs(next);
        }
    }
}

int main()
{
    cin >> T;

    while (T--)
    {
        cin >> N;

        for (int i = 1; i <= N; i++)
        {
            int v; cin >> v;
            a[i].push_back(v);
        }

        for (int i = 1; i <= N; i++)
        {
            if (chk[i] != 1)
            {
                dfs(i); ans++;
            }
        }

        cout << ans << "\n";

        for (int i = 1; i <= N; i++)
        {
            fill(a[i].begin(), a[i].end(), 0);
        }

        memset(chk, 0, sizeof(chk));

        ans = 0;

    }

    return 0;
}


'알고리즘 > 백준' 카테고리의 다른 글

[백준] 2667번 단지번호붙이기  (0) 2018.01.19
[백준] 2331번 반복수열  (0) 2018.01.16
[백준] 1707번 이분 그래프  (0) 2018.01.13
[백준] 9935번 문자열 폭발  (0) 2018.01.10
[백준] 1260번 DFS와 BFS  (0) 2018.01.09
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함