7/26 연습

2017. 7. 27. 18:51알고리즘 문풀/BOJ 연습

#1. 중량제한


문제 : icpc.me/1939


굉장히 다양한 풀이가 가능한 문제인데, description을 잘못 이해해서 ㅂㄷㅂㄷ하다가 결국 풀이를 까봤다.


1. BFS


물건을 보내는 공장을 ss, 받는 공장을 tt라고 하자.

또 각각의 정점까지 수송할 수 있는 최대의 비용을 F[v]F[v]라고 하자.

(정점 vv, c=ss에서 vv까지 옮길 수 있는 최대 비용)의 순서쌍을 저장할 수 있는 큐 QQ를 잡고, QQ(s,F[s] )(s,F[s]\leftarrow \infty)를 넣으면서 BFS 개시.


QQ가 빌 때까지, QQ의 front kk에 대해서 k.vk.v에 연결되어 있는 점 uu들을 보는데, min(k.c,bridge_capacity[vu])min(k.c,bridge\_capacity[v\to u])가 기존의 F[u]F[u]보다 크다면 이 값으로 F[u]F[u]를 갱신해주고, u,F[u]u,F[u]QQ에 넣으면 된다. 원하는 답은 F[t]F[t].


Time Complexity : O(BFS)=O(V+E)O(BFS)=O(V+E)


2. Kruskal Algorithm


문제를 잘 들여다보면, 결국 Minimum Spanning Tree에서 sts\to t의 경로 상에서 bridge_capacity의 최댓값을 찾는 문제가 됨을 알 수 있다.


크루스칼 알고리즘을 돌릴 때처럼, 모든 에지를 bridge_capacity가 큰 순서대로 정렬하자. Union-Find를 이용하여 계속 점을 이어주면서, 어떤 에지 ee를 추가했을 때 sstt가 이어지면 bridge_capacity[e]bridge\_capacity[e]를 출력하면 된다.


Time Complexity : O(ElgE+Eα(V))=O(ElgE)O(E lg E + E\alpha (V)) = O(E lg E)

얘가 왜 더 빠른지는 모르겠다. 입출력을 다르게 해서 그런가...




#2. 운동


문제 : icpc.me/1956


Floyd_Warshall 알고리즘으로 빠르게 답을 찾을 수 있다. 정점 uu에서 vv로 가는 최단경로의 길이를 sp[u][v]sp[u][v]라고 하면, sp[u][u]sp[u][u]의 최솟값을 출력하면 된다.


Time Complexity : O(V3)O(V^3)



'알고리즘 문풀 > BOJ 연습' 카테고리의 다른 글

7/30 ~ 7/31 연습  (0) 2017.08.01
7/29 연습  (0) 2017.07.30
7/27~7/28 연습  (0) 2017.07.29
7/25 연습  (0) 2017.07.26
7/24 연습  (0) 2017.07.25