각각의 정점은 간선이 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 |