반응형
백준 9466번 텀 프로젝트
시간초과에 주의해야되는 문제이다.
풀이 방법
1) 한번에 탐색만에 사이클이 있고, 없고를 판단하면서 지나가야한다.
2) 1->2->3->4->5->4 라는 것이 있으면 4,5가 사이클이다. 여기서 4,5가 사이클임을 파악해야되고, 6번으로 바로 넘어가야 시간초과가 뜨지 않는다.
#include<iostream>
#include<stack>
#include<vector>
#include<string.h>
using namespace std;
int ans;
int visited[100000]; //방문횟수 담는 배열
bool check[100000]; // 사이클을 찾았다는 뜻
int student[100000];
int T, number;
void input_data() { //입력받는 함수
cin >> number;
int num1;
for (int i = 1; i <= number; i++) { //1부터 입력을 받았음.
cin >> student[i];
}
}
void cycle(int n) {
if (visited[n] == -1 || check[n] == true) return;
if (visited[n] == 0) visited[n] = 1;
else if (visited[n]==1) {
check[n] = true; //사이클 찾음
ans++; //사이클 횟수 증가
}
cycle(student[n]);
visited[n] = -1; // 사이클 검사가 끝났으니 더 이상 방문할 필요 없다.
}
void sol() {
cin >> T;
while (T--) {
input_data();
for (int i = 1; i <= number; i++) if(visited[i]==0) cycle(i);
cout <<number -ans<<'\n';
//초기화
ans = 0;
memset(check, 0, sizeof(check));
memset(visited, 0, sizeof(visited));
memset(student, 0, sizeof(student));
}
return;
}
int main(void) {
sol();
}
반응형
'알고리즘 > acmicpc' 카테고리의 다른 글
[백준][1629번] 곱셈[cpp, c++] (0) | 2020.02.16 |
---|---|
[백준][2644번] 촌수계산[cpp, c++] (0) | 2020.02.15 |
[백준][6593번] 상범 빌딩[cpp, c++] (0) | 2020.02.12 |
[백준][2146번] 다리 만들기[cpp, c++] (0) | 2020.02.01 |
[백준][13913번] 숨바꼭질 4[cpp, c++] (0) | 2020.02.01 |