728x90
문제
https://www.acmicpc.net/problem/10451
문제 풀이
1. 입력값이 주어지면 무방향 인접 리스트를 이용하여 데이터를 저장한다.
2. 인접 리스트를 모른다면 나의 블로그의 인접 리스트 포스팅을 보고 와야 한다.
3. 인접 리스트로 저장 후 DFS알고리즘을 통해 노드 1~N까지 DFS알고리즘을 돌려준다.
4. 여기서 포인트는 visit 배열과 visited 배열 두 개가 있다는 것이다.
5. visit배열은 DFS의 사용하고 visited는 사이클을 구하는 배열이다.
6. 마지막으로 결괏값을 구하고 다음 케이스로 가기 전에 반드시 초기화를 해야 한다.
코드
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 | #include <iostream> #include <vector> #include <cstring> using namespace std; int T,N,cnt = 0; bool visit[1001] = {false}; bool visited[1001] = {false}; vector <int> adj[1001]; void DFS(int node){ visit[node] = true; visited[node] = true; for(int i = 0;i<adj[node].size();i++){ int next_node = adj[node][i]; if(visit[next_node]){continue;} DFS(next_node); } } int main(void){ cin >> T; for(int i = 0;i<T;i++){ cin >> N; for(int j = 1;j<=N;j++){ int a; cin >> a; adj[a].push_back(j); adj[j].push_back(a); } for(int k = 1;k<=N;k++){ memset(visit,false,sizeof(visit)); if(visited[k]){continue;} else{DFS(k);cnt++;visited[k] = true;} } memset(visited,false,sizeof(visited)); cout << cnt << "\n"; cnt = 0; for(int l = 0;l<=N;l++){adj[l].clear();} } } | cs |
728x90
'c++ 백준 문제 풀이' 카테고리의 다른 글
[백준/C++][오큰수(17298번)] (0) | 2020.12.15 |
---|---|
[백준/C++][경로 찾기(11403번)] (0) | 2020.11.30 |
[백준/C++][(1761번)정점들의 거리] (0) | 2020.11.19 |
[백준/C++][(1197번)최소 스패닝 트리] (0) | 2020.11.19 |
[백준/C++][(1922번) 네트워크 연결] (0) | 2020.11.19 |