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 |