반응형

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

 

14567번: 선수과목 (Prerequisite)

3개의 과목이 있고, 2번 과목을 이수하기 위해서는 1번 과목을 이수해야 하고, 3번 과목을 이수하기 위해서는 2번 과목을 이수해야 한다.

www.acmicpc.net

 

위상정렬을 이용하였습니다.

진입 차수가 0인 시작 지점의 노드들을 1로 초기화하고,

다음 순서로 큐로 들어가는 노드들의 깊이는 +1을 해주었습니다.

 

#include <iostream>
#include <queue>
#include <vector>
using namespace std;
#define MAX 1001

int n, m, a, b;
vector<int> graph[MAX];
int indegree[MAX] = { 0 };
int depth[MAX];

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	cin >> n >> m;
	while (m--) {
		cin >> a >> b;
		graph[a].push_back(b);
		indegree[b]++;
	}

	queue<int> q;
	for (int i = 1; i <= n; i++) {
		if (indegree[i] == 0) {
			q.push(i);
			depth[i] = 1;
		}
	}

	while (!q.empty()) {
		int node = q.front();
		q.pop();
		for (auto nxt : graph[node]) {
			if (--indegree[nxt] == 0) {
				q.push(nxt);
				depth[nxt] = depth[node] + 1;
			}
		}
	}

	for (int i = 1; i <= n; i++) {
		cout << depth[i] << " ";
	}
}

 

 

노드의 깊이를 더 큰 값으로 업데이트하는 방식으로도 풀 수 있었습니다.

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#define MAX 1001

int n, m, a, b;
vector<int> graph[MAX];
int depth[MAX];

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	cin >> n >> m;
	while (m--) {
		cin >> a >> b;
		graph[a].push_back(b);
	}
	
	for (int i = 1; i <= n; i++) {
		depth[i] = max(depth[i], 1);
		for (auto nxt : graph[i]) {
			depth[nxt] = max(depth[nxt], depth[i] + 1);
		}
	}

	for (int i = 1; i <= n; i++) {
		cout << depth[i] << " ";
	}
}
반응형

'Algorithm' 카테고리의 다른 글

백준 22945 : 팀 빌딩  (0) 2021.11.19
백준 1759 : 암호 만들기  (0) 2021.11.19
백준 2581 : 소수  (0) 2021.11.19
백준 1747 : 소수&팰린드롬  (0) 2021.11.19
백준 1240 : 노드사이의 거리  (0) 2021.11.19

+ Recent posts