PS/알고리즘

[백준] 열혈강호 시리즈 (C++)

dong_gas 2022. 2. 8. 06:22

최근에 신촌 연합 중급반에서 flow에 대해 배웠다.

나에게는 어려워서 거의 이해하지 못한 상태로 수업이 끝났다.

최근 며칠 동안 영상도 다시 보고, 종만북을 한 번 읽었더니 좀 감이 잡힌 것 같다.

 

그래서 야심한 새벽에 강의 연습문제에 있는 열혈강호 시리즈를 풀어보았다.

플래티넘 막 푸니까 정말 재미있는 듯? ㄹㅇㅋㅋ

 

열혈강호 문제가 1~6까지 있더라.

1. boj.kr/11375

2. boj.kr/11376

3. boj.kr/11377

4. boj.kr/11378

5. boj.kr/11408

6. boj.kr/11409

 

일단 방금 1, 2, 3을 풀었기 때문에 간단하게 풀이(그래프 모델링방법?)를 남겨보려고 한다.

조만간 시간이 나면 열혈강호 4, 5, 6도 풀어보아야겠다. (업뎃 예정) (2/8 열혈강호4 추가완료)

 

그림이 발퀄이니 조심하자.

 

1. 열혈강호 (11375)

더보기

회사에 직원이 N명, 일이 M개있다.

근데 각 직원은 한 개의 일만 할 수 있고, 각각의 일을 담당하는 사람은 1명이어야 한다.

다음과 같이 모델링하면 된다. 

간선의 가중치는 모두 1이다.

왜 가중치가 다 1이냐면

소스->직원의 가중치 : 직원마다 할 수 있는 일이 한 개라고 했으니까

직원->일의 가중치 : 1보다 크기만 하면 상관없다. 

일->싱크의 가중치 : 각 일마다 담당하는 사람이 1명이니까

 

 

2. 열혈강호2 (11376)

더보기

이 문제는 열혈강호(11375)와 다 같지만, 각 직원은 최대 2개의 일을 할 수 있다.

다음과 같이 모델링하면 된다.

소스 -> 직원으로의 가중치가 2로 바뀌었다. 

왜 why? 각 직원은 2개의 일을 할 수 있으니까.

 

 

3. 열혈강호3 (11377)

더보기

열혈강호 1, 2는 바로 풀었는데, 이건 고민이 조금 필요했다.

우선 열혈강호1과 굉장히 비슷하다. 하지만 이 문제에서는 N명 중에서 K명은 일을 2개까지 할 수 있다.

그러니까 뭐 대충 N+K개의 일을 할 수 있게 된다.

따라서 우선 소스->직원으로 흘려주는 양을 N+K로 하면 될 거라고 생각이 들었다.

그렇다면 어떤 직원에게 2를 흘려주고 어떤 직원에게 1을 흘려줘야 할까를 고민했는데, 답이 없었다.

 

왜냐하면 그리디?하게 알 수 있나 생각해 보았을 때, 알 수 없었다. 또, 완전 탐색은 시간 초과가 날 게 뻔했다.

그러다가 든 생각이 N개에 우선 용량 1을 주고 생각해보았다.

그러고 나니, 임시 노드 하나를 추가하여 용량을 1씩 더 주게 하였다. 참고로 임시 노드로 향하는 간선의 용량은 K로 두었다.

이렇게 되면 그냥 바로 열혈강호1과 같은 문제가 된다.

 

말로 하니 어려운 것 같은데, 그림으로 보자.

그림이 구리긴 하다.

그니까 임시 노드를 추가하여 소스->임시 간선의 용량을 K로 하면 N+K를 흘려줄 수 있게 된다.

끝.

 

 

4. 열혈강호4 (11378)

더보기

문제가 되게 다른 거 같지만, 열혈강호3와 똑같다.

벌점을 받은 사람은 벌점만큼의 일을 더 할 수 있다. 그니까 총 벌점+1의 일을 할 수 있다.

이 문제에서는 벌점의 총 합은 정해져 있지만, 벌점을 자유롭게 배분할 수 있다.

그러니까 임시->직원으로 가는 간선의 용량을 무한대값으로 잡아준 뒤, 최대 유량을 구하면 알아서 잘 배분될 것이다.

임시->직원 간선의 용량이 무한대인 것을 알 수 있다.

여담으로 이 문제가 열혈강호3보다 티어가 낮다. 나는 이 문제가 열혈강호3와 동등하거나 그 이상이라고 생각한다.

 

---아래는 풀면 업데이트 예정

5. 열혈강호5 (11408)

6. 열혈강호6 (11409)

---

 

열혈강호3, 4를 풀고 나서 생각난 건데, 그래프 문제에서 노드 하나를 추가하여 생각하는 방법을 예전에도 본 적이 있었다.

whcho0504가 SPC에 냈던 MST 문제가 있었다. boj.kr/23743

조건을 따져가면서 풀어도 되지만, 출구를 0번 노드로 두면 그냥 기본 MST문제와 똑같아졌던 기억이 있다.

전혀 다른 문제지만 신기해서 ㅎㅎ

'PS > 알고리즘' 카테고리의 다른 글

순열 사이클 분할의 성질  (6) 2023.01.07
Suffix Array와 LCP 풀어보기  (1) 2022.10.15