일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 백준
- AOP
- Paging
- 의존성
- MSA
- CircuitBreaker
- 트랜잭션
- 미션
- yml
- AWS
- 프리코스
- REDIS
- 스프링부트
- Level2
- Spring Batch
- 코드리뷰
- 세션
- 우테코
- JUnit5
- 서블릿
- mock
- 프로그래머스
- Docker
- 우아한테크코스
- 레벨2
- 스프링 부트
- 자바
- HTTP
- 우아한세미나
- JPA
Archives
- Today
- Total
늘
acmicpc_1005(ACM Craft) 본문
728x90
위상정렬 알고리즘을 통하여 해결하였다. 위상 정렬 알고리즘(Topology Sort)은 어떤 일을 하는 순서를 찾는 알고리즘이다. 방향 그래프에서 각 정점의 작업(?)수행 순서에 따라서 정렬은 한다고 볼 수 있다.
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
int n, k;
int time[1001];
int dp[100001];
int degree[100001];
vector<int> v[100001];
int a, b, c;
void clear() {
for (int i = 1; i <= n; ++i) {
dp[i] = 0;
time[i] = 0;
degree[i] = 0;
fill(v[i].begin(), v[i].end(), 0);
}
}
void bfs() {
queue<int> q;
for (int i = 1; i <= n; ++i) {
if (degree[i] == 0) {
q.push(i);
dp[i] = time[i];
}
}
while (!q.empty()) {
int edge = q.front();
q.pop();
for (int i = 0; i < v[edge].size(); ++i) {
int nedge = v[edge][i];
dp[nedge] = max(dp[nedge], dp[edge] + time[nedge]);
if (--degree[nedge] == 0) {
q.push(nedge);
}
}
}
}
int main() {
int t;
cin >> t;
for (int x = 0; x < t; ++x) {
cin >> n >> k;
for (int i = 1; i <= n; ++i) {
cin >> time[i];
}
for (int i = 1; i <= k; ++i) {
cin >> a >> b;
v[a].push_back(b);
degree[b]++;
}
bfs();
cin >> c;
cout << dp[c]<<'\n';
clear();
}
}
개인적으로 bfs와 비슷하다고 생각하고, topology이름이 조금 길기도 하고.. 혼자 작성하는 코드이기때문에 bfs이름으로 작성하였다. 변수 a와 b에서 a가 우선으로 작업하고 그 후 b를 작업한다.(a->b)
degree는 진입차수의 개수를 말해주고 진입차수가 0이되면 그 때의 정점이 작업을 시작한다.
728x90
'알고리즘_백준 > DP' 카테고리의 다른 글
[백준] C/C++ 퇴사 [삼성 SW 역량 테스트 기출 문제 ] (0) | 2021.10.05 |
---|---|
acmicpc_14585(사수빈탕) (0) | 2021.02.21 |
acmicpc_2293(동전 1) (0) | 2021.02.19 |
acmicpc_12738(가장 긴 증가하는 부분 수열 3)(LIS) (0) | 2021.02.16 |
Comments