PS

[BOJ] 9466번 : 텀 프로젝트

yunny_world 2023. 1. 12. 22:31

https://www.acmicpc.net/problem/9466

 

9466번: 텀 프로젝트

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

www.acmicpc.net


풀이

일단, 문제를 다음과 같이 해석할 수 있다.

(인덱스 → 선택된 학생의 번호) 의 간선들로 이루어진 그래프에서 사이클을 구성하지 않는 정점의 개수를 구하라.

 

https://yunny-world.tistory.com/56

 

[BOJ] 11581번 : 구호물자

https://www.acmicpc.net/problem/11581 11581번: 구호물자 서기 2050년 엄청나게 강력한 폭풍이 인천을 강타했다. 강력한 폭풍의 영향으로 모든 사람은 대피소로 대피하였으며, 많은 도로가 유실되었다. 그나

yunny-world.tistory.com

방향 그래프에서 사이클을 찾아야 하기 때문에, 위 문제와 동일한 방법으로 해결 가능하다.

 

프로젝트 팀에 속하지 못한 학생들의 수 = 전체 학생 수 - 프로젝트 팀에 속한 학생들의 수

이기 때문에 '프로젝트 팀에 속한 학생들의 수', 즉, '사이클 내 정점의 개수'를 구하면 답을 구할 수 있다.

'len[i] = i번 정점까지 이어진 정점들의 개수'를 관리하여 구할 수 있다.


코드

ll n, haveTeam;
ll v[100005];
ll g[100005];
ll len[100005];

void dfs(ll x, ll p)
{
	if (v[x] == 1)
	{
		haveTeam += len[p] - len[x] + 1;
		return;
	}
	len[x] = len[p] + 1;
	v[x] = 1;
	if (v[g[x]] != 2) dfs(g[x], x);
	v[x] = 2;
}

void solve()
{
	haveTeam = 0;
	memset(v, 0, sizeof(v));
	memset(len , 0, sizeof(len));
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> g[i];
	for (int i = 1; i <= n; i++) 
		if (!v[i])
		{
			len[i] = 1;
			dfs(i, 0);
		}
	cout << n - haveTeam << '\n';
}

 

'PS' 카테고리의 다른 글

서로 나누어 떨어지는 자연수 집합  (0) 2023.03.03
순열과 그 인덱스 배열 간의 관계  (4) 2023.01.25
x와 가장 가까운 수 y 찾기  (1) 2022.12.26
[BOJ] 9946번 : 아이템 제작  (4) 2022.12.23
22/12/04 PS  (2) 2022.12.04