[BOJ/9466] 텀 프로젝트, c++

2021. 3. 16. 02:15·DEV/PS

 

www.acmicpc.net/problem/9466

 

9466번: 텀 프로젝트

이번 가을학기에 '문제 해결' 강의를 신청한 학생들은 텀 프로젝트를 수행해야 한다. 프로젝트 팀원 수에는 제한이 없다. 심지어 모든 학생들이 동일한 팀의 팀원인 경우와 같이 한 팀만 있을

www.acmicpc.net

한줄 후기 : 전에 못 풀던 문제를 다시 풀었는데 맞으면 진짜 기쁘다

 

문제를 잘 읽어보면 결국 한 팀이 된다는건 4->7->6->4 이렇게 한팀 즉, 그래프로 생각했을 때 사이클이 만들어지면 한 팀이 되는 것이다.

그럼 팀에 속하지 못한 학생의 수이니 사이클 탐지를 하며 개수를 세어 전체 수에서 빼주면 답이 된다.

 

//AC
//BOJ 9466 텀 프로젝트
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
int v[101010];
bool visit[101010];
int pr[101010];
bool cycle[101010];
int cnt = 0;
void dfs(int s){
	visit[s] = true;
	if(!visit[v[s]]){
		pr[s] = v[s];
		dfs(v[s]);
	}
	else if(!cycle[v[s]]){
		for(int i=v[s]; i != s; i = pr[i]){
			cnt++;
		}
		cnt++;
	}
	cycle[s] = true;
}
int main(){
	int T;
	cin >> T;
	while(T--){
		int n;
		cnt = 0;
		scanf("%d", &n);
		for(int i=1; i<=n; i++){
			scanf("%d", &v[i]);			
		}
		for(int i=1; i<=n; i++){
			if(!visit[i]){
				dfs(i);
			}
		}
		printf("%d\n", n-cnt);
		memset(visit, false, sizeof(visit));
		memset(cycle, false, sizeof(cycle));
	}
}

이런게 뿌듯하다니깐요?

 

void dfs(int s){
	visit[s] = true;
	if(!visit[v[s]]){
		pr[s] = v[s];
		dfs(v[s]);
	}
	else if(!cycle[v[s]]){
		for(int i=v[s]; i != s; i = pr[i]){
			cnt++;
		}
		cnt++;
	}
	cycle[s] = true;
}

여기가 사이클 탐지+팀에 속한 사람 수 세는 부분이다.

어차피 한명당 한 사람만 고를 수 있으니 일차원 배열에 그래프를 기록해도 된다.

pr 배열에는 해당 노드가 고른 노드를 넣어주면 된다.

그리고 dfs 가 끝난 노드는 cycle 배열을 true 로 만드는데 만약 이 cycle이 false라면, 즉 내가 고른 노드가 아직 방문하지 않은 노드라면 for문을 돌면서 i = pr[i] 계속 그래프를 타고타고 넘어가다 현재 나와 만날 때 까지 count를 세준다. 

마지막엔 나와 만났으니 나까지 세주면 된다.

결과적으로 n-cnt가 정답이 된다.

 

 

 

저작자표시 비영리 변경금지 (새창열림)

'DEV > PS' 카테고리의 다른 글

[BOJ/14938] 서강 그라운드, c++  (0) 2021.04.05
[BOJ/20924] 트리의 기둥과 가지, c++  (0) 2021.03.29
[BOJ/20955] 민서의 응급 수술, c++  (0) 2021.03.08
[BOJ/20956] 아이스크림 도둑 지호, c++  (0) 2021.03.08
2021 SUAPC winter 주저리..  (0) 2021.03.04
'DEV/PS' 카테고리의 다른 글
  • [BOJ/14938] 서강 그라운드, c++
  • [BOJ/20924] 트리의 기둥과 가지, c++
  • [BOJ/20955] 민서의 응급 수술, c++
  • [BOJ/20956] 아이스크림 도둑 지호, c++
jobchae
jobchae
말하는 감자지만, 코드를 끄적이는 Node.js 백엔드 개발자입니다.
  • jobchae
    JOBCHAE
    jobchae
  • 전체
    오늘
    어제
    • 🚀 JOBCHAE (182)
      • DEV (151)
        • PS (108)
        • Node.js (12)
        • React (3)
        • docker (1)
        • 잡다한 개발 일지 (21)
        • injection (1)
        • JS, TS (3)
        • DB (2)
      • 축구 (0)
      • 일상 (19)
      • 영화 (3)
      • 음악 (8)
  • 블로그 메뉴

    • 💻 Github
    • 🙋🏻 Linkedin
    • 📖 방명록
  • 링크

    • PS Github
  • 공지사항

  • 인기 글

  • 태그

    알고리즘
    백준
    JavaScript
    react
    렛츠락페스티벌
    BFS
    DFS
    SOPT
    우선순위큐
    개발
    typescript
    DP
    boj
    Express
    이분탐색
    db
    mongoDB
    슬랙봇
    Nest.js
    앱잼
    일상
    리액트
    PS
    GitHub
    회고
    위상정렬
    node.js
    슬랙
    nodejs
    솝트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
jobchae
[BOJ/9466] 텀 프로젝트, c++
상단으로

티스토리툴바