21937번 : 작업
문제)
민상이는 자신이 해야할 작업 개를 아래와 같이 작업 순서도로 그려보았다.
![](https://blog.kakaocdn.net/dn/K5Y9m/btsrCTGOpmg/qPQBXJtHHpyYq4QxBwU4AK/img.png)
위 그림에서 5번 작업을 하기 위해 제일 먼저 2번 작업을 끝내야 하고 그 다음으로 4번 작업을 끝내야 5번 작업을 할 수 있다. 3번 작업은 먼저 해야하는 작업이 없으므로 3번 작업을 바로 시작 할 수 있다.
작업 순서를 정할때 위배되는 작업 순서는 없다. 예를 들어, A 작업을 하려면 B 작업을 먼저 해야하고, B 작업을 해야하기 전에 A 작업을 해야하는 상황은 없다.
민상이는 오늘 반드시 끝낼 작업 가 있다. 민상이가 작업 을 끝내기 위해서 먼저 해야하는 작업의 개수를 구해주자!
입력 :
민상이가 작업할 개수 와 작업 순서 정보의 개수 이 공백으로 구분되어 주어진다.
두 번째줄부터 줄까지 작업 와 작업 가 공백으로 구분되어 주어진다. 이때 두 값의 의미는 작업 를 하기 위해서 바로 이전에 작업 를 먼저 해야한다는 의미이다. 중복된 정보는 주어지지 않는다.
마지막 줄에는 민상이가 오늘 반드시 끝내야하는 작업 가 주어진다.
출력 :
민상이가 작업 를 하기 위해 먼저 해야하는 일의 개수를 출력한다.
풀이)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
#include <iostream>
#include <vector>
using namespace std;
int n, m;
vector<vector<int>> vec;
vector<bool> visited;
int cnt = -1;
void dfs(int cur)
{
visited[cur] = 1;
cnt++;
for (auto nxt : vec[cur])
{ // 이미 방문한 곳은 중복해서 방문하면 안된다.
if (visited[nxt]) continue;
dfs(nxt);
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n >> m;
vec.resize(n + 1, vector<int>());
visited.resize(n + 1, 0);
int a, b;
for (int i = 0; i < m; i++)
{
cin >> a >> b;
// 방향을 역으로 생각하면 된다.
vec[b].push_back(a);
}
int root = 0;
cin >> root;
dfs(root);
cout << cnt;
return 0;
}
|
cs |
출처 : https://www.acmicpc.net/problem/21937
21937번: 작업
민상이가 작업할 개수 $N$와 작업 순서 정보의 개수 $M$이 공백으로 구분되어 주어진다. 두 번째줄부터 $M + 1$ 줄까지 작업 $A_i$와 작업 $B_i$가 공백으로 구분되어 주어진다. 이때 두 값의 의미는 작
www.acmicpc.net
'Develop > 백준 (Cpp)' 카테고리의 다른 글
[백준] 10472번 : 십자뒤집기 (C++) (0) | 2023.08.20 |
---|---|
[백준] 21922번 : 학부 연구생 민상 (C++) (0) | 2023.08.20 |
[백준] 21920번 : 서로소 평균 (C++) (0) | 2023.08.19 |
[백준] 17090번 : 미로 탈출하기 (C++) (0) | 2023.08.18 |
[백준] 18404번 : 현명한 나이트 (C++) (0) | 2023.08.17 |