lyzqm   6년 전

이 문제를 풀려고 하는데요.

해당 간선을 사용하지 않고 MST를 구하는 문제입니다.

만약 다음과 같은 그래프가 있다고 합시다.

mst.png

붉은색선은 MST의 트리간선이고 초록색은 트리간선이 아닌 간선입니다.

파란x 표시되있는 간선을 지우고 나머지 MST는 유지한채 트리간선이 아닌 다른간선(초록선)으로 대체하려고 하는데요.

(물론 초록선중에 값이 작은놈으로 대체)

이것이 해당 조건에 맞는 MST를 구하는 방법이 맞는지 모르겠네요...

반례가 있을까요? 도와주세요


smu201111192   6년 전

네 올바른 방법 같습니다.

1. 스패닝트리 엣지가 아닌 다른엣지를 지운다면, 원래 만든 mst가 답이 될거고,

2. 스패닝트리 엣지를 지운다면 해당 엣지를 기준으로 분리된 subtree가 2개가 생깁니다.

이 경우 분리된  두 subtree를 연결할수 있는 최소의 엣지를 찾으면됩니다.


lyzqm   6년 전

감사합니다.

사실 고민하는도중 풀이가 맞다는것을 깨달았는데요.

또 다른 문제는 답변해주신 2번방법인데 문제에서 query가 M번들어오니 적어도 하나의 query에 O(logM)으로 해결해야할 것 같은데

마땅한 전처리 방법이 생각나지 않네요..

혹시 아신다면 힌트 주시면 감사하겠습니다 ㅋㅋ..

smu201111192   6년 전

1.mst를 구축합니다.

2.mst에 속하지 않은 엣지를 오름차순으로 정렬해서 저장합니다.

3.mst에 속하지 않은 엣지를 작은거부터 꺼냅니다.

현재보고 있는 엣지 i (mst 에 속하지 않은)가 버텍스 u,v를 연결하고 있고  그때의 가중치는 w라고 해봅시다.

i를 mst에 추가하면 path (u,v)상에 있는  어떤 엣지를 끊어도 트리는 유지가됩니다.

이 점을 이용해서 오프라인으로 푸시면 될거 같네요. 




lyzqm   6년 전

답변 감사합니다.

참고해서 풀어볼게요!

smu201111192   6년 전

path(u,v)상의 엣지는  i보다 뒤의 엣지로도 대체 가능할 수도 있겟지만,

이 경우 항상 손해를 봅니다. (w[i] <= w[i+1]) 

그러므로 대체 가능한 엣지를 찾은  엣지들은  더 이상  고려하지 않도록 해주시면 될거같네요.


lyzqm   6년 전

@smu201111192

9%정도에서 시간초과가 나는데 제 풀이 봐주실 수 있나요?

말씀하신대로 mst가 아닌 간선들을 오름차순으로 정렬한다음에 작은것 부터 꺼냈는데요.

mst.png

해당 간선이 {u,v}이면 path(u,v)로 대체할 수 있기 때문에 그 경로를 찾기위해서 위와 같이 {u,v}의 MST LCA를 구했습니다.

그러면 ① 번 과정인 path(u, lca)를 탐색하며 아직 대체하지 못하는 경로인경우 갱신해줍니다.

②번 과정도 마찬가지로 path(v, lca)를 탐색하며 갱신해줍니다.

탐색할때는 u나 v에서 depth를 한칸씩 내리면서 탐색하는데요. 이 작업이 많아서 TLE가 나오는것 같습니다.

 시간을 좀 줄일 수 있는 방법이 있을까요?

코드도 같이 올릴게요.

lyzqm   6년 전

으아 아닙니다

해결했네요 ㅠ_ㅠ!

smu201111192   6년 전

이제 봤네요 ~ 축하드립니다.

댓글을 작성하려면 로그인해야 합니다.