각각의 정점은 간선이 1개씩 밖에 없다.

 

사이클이 형성되지 않는 정점의 개수를 출력하면 된다.

 

** 사이클을 찾는 알고리즘을 내 코드로 다시 풀어서 작성해볼것.

finished 배열을 다른 것으로 대체할 수 있는지 확인할 것

 

 

 

#include <iostream>
#include <vector>
#include <cstring>
using namespace std;


int cnt = 0;

int graph[100002];
bool *visited = new bool[100002];
bool *finished = new bool[100002];

void dfs(int pos) {
	visited[pos] = true;
	int next = graph[pos];
	if (visited[next]) {
		if (!finished[next]) {
			//printf("cycle! %d\n", pos);
			//왔던 경로 다시돌면서 사이클에 속하는 정점들 체크해서 ++
			for (int temp = next; temp!= pos; temp= graph[temp]) {
				//printf("++\n");
				cnt++;
			}
			cnt++; //위에 for문에서 다음꺼부터 탐색했으므르 자기자신도 포함 ++
		}
	}
	else {
		dfs(next);
	}
	finished[pos] = true;

}

int main() {

	
	int testCnt;
	scanf("%d", &testCnt);
	for (int T = 1; T <= testCnt; T++) {
		int num;

		scanf("%d", &num);
		

		for (int i = 1; i <= num; i++) {
			scanf("%d", &graph[i]);
		}
		for (int i = 1; i <= num; i++) {
			finished[i] = visited[i] = false;
		}
		cnt = 0;
		for (int i = 1; i <= num; i++) {
			vector<int> list;
			if(!visited[i])
				dfs(i);
		}
		printf("%d\n", num - cnt);
		

	}

	return 0;
}

'알고리즘' 카테고리의 다른 글

BOJ 10552번: DOM  (0) 2020.01.28
BOJ 11403번: 경로 찾기  (0) 2020.01.27

+ Recent posts