알고리즘 문제해결전략(99)
-
[그래프] Graph 11: 네트워크 유량(Network flow) : 포드-풀커슨 알고리즘
1. 그래프의 용량(Network Flow) 네트워크를 이용해 아주 큰 파일을 다운로드하는 중이라고 하자. 이렇게 존송받을 자료의 양이 많을 때 관심을 갖는 부분은 서버가 보낸 패킷이 내 컴퓨터에 몇 밀리초 만에 도착하느냐가 아니라 1초에 몇 MB의 자료를 전송받을 수 있느냐이다. 네트워크를 구성하는 케이블들에는 일정한 대역폭이 있기 때문에, 단위 시간당 일정량 이상의 자료를 전송할 수 없다. 따라서 패킷을 여러 경로로 나누어 보내 그 중 일부가 좀더 먼 길을 돌아오더라도 초당 10MB를 전송받는 것이 훨씬 이득이다. 이렇게 각 간선이 용량을 갖는 그래프에서 두 정점 사이에 얼마나 많은 '흐름' 혹은 '유량'을 보낼 수 있는지를 계산하는 문제를 네트워크 유량 문제(Network Flow)라고한다. 네트워..
2021.02.23 -
[그래프] [시도x] TPATH 여행 경로 정하기
1. 문제 한 도시에서 다른 도시까지 여행을 하고싶다. 철도망은 여러 개의 역들과 그들을 잇는 노선으로 구성되어 있다. 각 구간별로 철도의 운행 속도가 정해져 있다. 가속과 감속을 반복하면 멀미때문에 괴롭다. 따라서 항상 비슷한 속도로 여행하고싶다. 철도망이 주어질때 여행 구간 중 최대 운행 속도와 최소 운행 속도의 차를 최소화하는 경로를 찾는 프로그램을 작성하라 시작 철도역은 항상 0 번이고 도착할 철도역은 항상 N-1번이다. 2. 책의 풀이1 어떤 경로에서 모든 간선의 가중치가 어떤 값 U이거나 그보다 작을 때, U를 '상한'이라고 하고 반대로 모든 간선의 가중치가 어떤 값 L이거나 그보다 클 때, L을 이 경로의 '하한'이라고 하자. 경로의 최소 상한과 최대 하한의 차이를 경로의 '너비'라고 하면 ..
2021.02.23 -
[그래프] LAN 근거리 네트워크
1. 문제 이 문제는 이미 연결된 집합을 한 정점으로 표현하여 최소 스패닝 트리를 구하는 문제이다. 이 문제의 핵심은 연결된 집합을 한 정점으로 어떻게 표현할 것인가에 있다. 2. 유니온 파인드 : 크루스칼 알고리즘 이미 연결된 집합을 유니온-파인드 자료구조로 표현하여 각 집합사이의 최소 거리를 구하려면 많이 복잡하다. 이를 간결하게 구현하려면 소방차 문제에서 그랬듯이 임의적인 방법이 필요하다. 그러므로 책에서는 연결된 정점끼리 이어지는 간선의 가중치를 0으로 설정해서 항상 이 간선을 선택하게끔 하였고 가중치가 0이므로 추가되는 가중치의 합을 구할 수 있게 하였다. 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 ..
2021.02.23 -
[그래프] Graph 10: 최소 스패닝 트리: 크루스칼, 프림 알고리즘
1. 최소 스패닝 트리(Minimum Spanning Tree) 외판원 문제 휴리스틱에서나 각종 그래프의 탐색 알고리즘, 최단 경로 알고리즘에서 경로를 찾는데에 사용했었다. 어떤 무향 그래프의 스패닝 트리(Spanning Tree)는 원래 그래프의 정점 전부와 간선의 부분 집합으로 구성된 부분 그래프이다. 이때 스패닝 트리에 포함된 간선들은 정점들을 트리 형태로 전부 연결해야한다. 트리 형태라는 것은 선택된 간선들이 사이클을 이루지 않는다는 것을 의미하며, 정점들이 꼭 부모-자식 관계로 연결될 필요는 없다는 것을 의미한다. 또한 그래프안에 여러 개의 스패닝 트리가 있다. 이런 스패닝 트리 중에서 가중치의 그래프의 스패닝 트리 중 가중치 합이 가장 작은 트리를 찾는 문제를 최소 스패닝 트리 문제(Minim..
2021.02.22 -
[그래프] [시도 x] PROMISES 선거 공약
1. 문제 새로 건설할 당위성이 있다: 고속도로를 통해 오갈 수 없던 두 도시가 새로 연결됨. 두 도시를 오가는 데 걸리는 시간이 단축 되어야함 N년간 하나씩 고속도로를 건설할때 이들 중 몇 개가 의미가 없는지 계산하여라 2. 플로이드 n번 역시 간단한 풀이는 그냥 건설할때마다 플로이드를 수행하는 것이다, 하지만 이는 시간초과로 문제를 시간안에 해결할 수 없다. 또다른 방법은 플로이드를 계산할때 a, b 정점을 경유하는지 기록하는 것 만약 고속도로가 추가되면 이 기록을따라 a->b, b->a거리를 업데이트 시키고, b와 a에 대해서만 플로이드를 다시 수행하는 것이다. 하지만 이것은 구현도 까다롭고 복잡하다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ..
2021.02.22 -
[그래프] DRUNKEN Drunken Driving
1. 문제 이 문제는 경유점이 중요하다. 한 정점마다 경유하는지를 조사하고 그 경유점으로 인해 최소거리가 되는지 조사하는 플로이드 알고리즘을 이용하여 이 문제를 해결할 수 있다. 2. 경유점 정렬 플로이드 알고리즘에서 정점들의 추가 순서는 알고리즘의 정당성에는 영향을 미치지 않는다. 따라서 delay에 대해 정렬하고, delay가 작은것 부터 조사하게 되면 경로에서 어떤점이 최대의 delay를 가지는지 별도의 연산이 필요없게된다. (항상 추가하는 정점이 현재 최대 delay이므로) 3. 플로이드 알고리즘: 잘못된 풀이 플로이드 알고리즘을 적용시킨 처음 풀이는 다음과 같았다. 정점 w를 추가 하였을 때 adj[i][w] + adj[w][j] + delay[w] 에서 i->w 에서 생기는 딜레이와 w->j ..
2021.02.22