코드 작성중 reset()를 작성할때 graph배열의 인덱스를 1부터 n까지쓰므로
초기화할때도 1부터 n까지 다 초기화를 해줘야한다.
나는 실수로 0~n까지 초기화를 시켰다.
for(auto w : graph[v])
벡터에서 반복문을 쓸때 자주 사용되는 방식의 문법이다.
graph[v]의 원소들을 하나씩 w에 대입시켜서 반복시킨다는 말이다.
graph[v] = {3,4,5}라면,
처음돌때는 w=3
두번째는 w=4
마지막은 w=5가 되는것이다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>
#include <math.h>
#include <string>
#include <string.h>
#include <queue>
using namespace std;
#define endl "\n"
#define MAX 1000+1
int t, n;
vector<int> graph[MAX];
bool visited[MAX];
void reset() {
	for (int i = 1; i <= n; i++)
	{
		graph[i].clear();
		visited[i] = false;
	}
}
void dfs(int v) {
	visited[v] = true;
	for (auto w : graph[v]) {
		
		if (!visited[w])
		{
			dfs(w);
		}
	}
}
int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
	//ifstream cin; cin.open("input.txt");
	cin >> t;
	while (t--)
	{
		cin >> n;
		reset();
	
		for (int i = 1; i <= n; i++)
		{
			int tmp;
			cin >> tmp;
			graph[i].push_back(tmp);
		}
		int cnt = 0;
		for (int i = 1; i <= n; i++)
		{
			if (!visited[i])
			{
				dfs(i);
				cnt++;
			}
		}
		cout << cnt << endl;
	}
}