flxl765   5년 전

최소 히프로 가중치가 적은 순서대로 정렬하도록 썼구요

while(H->heap_size != 0) 문에서 최단 거리 설정해주고 

나름 신경써서 코딩했는데 출력값은

0

INF

INF

INF

INF

이렇게밖에 안떠서 멘붕왔네요;; 거의 하루종일 싸맸는데...하...

vl0612   5년 전

댓글 쓰고 오류가 있어서 고치려고 했더니 수정이 안되네요 또르륵... 이건 건의해봐야겠습니다..

vl0612   5년 전

일단 고쳐보았습니다.

제가 ->이런 거나 *이런거나 malloc pragma 하나도 모르는 사람인지라ㅋㅋㅋ 대충 코드눈치보며 고쳐보았습니다.

틀린 부분 및 없어도 되는 군더더기(당장 이 코드에서 없어도(주석처리해도) 돌아가는 부분만) 대강 표기해두었습니다.

Heap 자료구조를 직접 만들어쓰다니......ㄷㄷ 자료구조를 직접 구현할 수 있다는 점은 매우 존경스럽지만, 알고리즘 공부를 위해서라면 C++ 쓰는 것을 추천합니다.

C++에서는 priority_queue 라고 개발자들이 제공하는 훌륭한 STL이 제공됩니다. 문법 쪼끔만 공부하면 돼요. 

동적배열도 stl에 있는 vector로 간단히 선언 및 여러 유용한 사용이 가능합니다

저런 어려운 문법과 자료구조 구현이 실제 프로그래밍 할 때는 도움되겠지만, 지속적이고 편안한(?) 알고리즘 공부를 위해서는 좀 더 경량화된 문법 등을 사용하는게 편리하다고 생각합니다. (본인이 문법을 못 읽어서 하는 찡얼거림 맞습니다 ㅋㅋㅋ)

+

그리고 아래와 같이 고치면 당장 예제는 돌아가지만

제출 결과 테스트케이스에 대해서는 <메모리초과>가 나옵니다. 추가 댓글로 피드백하겠습니다.

vl0612   5년 전

일단, (문법도 모르면서 대충 읽어보기에) 코드의 흐름 자체는 틀린 점이 없습니다. 솔직히 해당문법에서 군더더기도 adj_mat관려된 부분밖에 없다는 점에서 (저보다 훨씬(...)) 훌륭합니다.


메모리 초과가 나는 원인

<그래프를 나타내는 방식에는 인접행렬과 인접리스트 방식이 있습니다.

그리고 위의 코드에서 사용한 방식은 아마 인접행렬로 추정되고

20000*20000 짜리 배열이 만들어지니까 메모리 가볍게 초과...

인접리스트를 사용하면 간선 개수에 비례하여 메모리를 먹으므로 30만개 정도면 굉장히 여유롭게 메모리를 사용할 수 있습니다. (128mb면 수천만개 int배열 선언이 가능하니까요)

"결론 : 지우고 다시 짜는게 편합니다."


나아가 알고리즘 대회를 위한 간단한 두가지 피드백을 드리자면

  1. 전역변수 활용을 생활화 합시다.

실무관련 프로그래밍 혹은 자바 쓰시는 분들은 지역변수를 주고 받고 하는 것을 사랑한다고 들었지만

알고리즘 대회에서 전역변수를 사용하면 시간적으로두, 혹은 코드의 쾌적함을 위해서라두 정말로 얻을 수 있는 점이 많습니다.


2. C++를 사용합시다 C++에 STL을 생활화합시다.

자료구조를 직접 구현할 수 있다는 점은 매우 존경스럽지만, 알고리즘 공부를 위해서라면 C++ 쓰는 것을 추천합니다.

C++에서는 priority_queue 라고 개발자들이 제공하는 훌륭한 STL이 제공됩니다. 문법 쪼끔만 공부하면 돼요.

동적배열도 stl에 있는 vector로 간단히 선언 및 여러 유용한 사용이 가능합니다

저런 어려운 문법과 자료구조 구현이 실제 프로그래밍 할 때는 도움되겠지만, 지속적이고 편안한(?) 알고리즘 공부를 위해서는 좀 더 경량화된 문법 등을 사용하는게 편리하다고 생각합니다.

(본인이 문법을 못 읽어서 하는 찡얼거림 맞습니다 ㅋㅋㅋ)

+a

조언으로

printf함수는 어느 부분에서 문제가 일어났는지 파악할 때 용이합니다.

아무 코드 중간에 printf("Hello World");를 삽입한 뒤 헬로 월드가 출력 여부에 따라 그 부분이 실행되었음을 볼 수 있습니다.




요약하자면 

  1. C++를 공부합시다
  2. C++의 priority_queue와 vector를 익힙시다.
  3. 전역변수 활용을 생활화 합시다.
  4. 문법 공부 ㄱㄱ 
  5. 솔직히 코딩 실력은 저보다 좋아보입니다. 따라서 저는 이제 짜지겠습니다 쭈그리쭈그리

++

쭈그리짜그리 짜지기 전에

제 C++코드 하나를 주서고가 함께 첨부하고 사라지겠습니다.

예전에 짰던 거를 지금 살짝 군더더기만 제거한거라 변수명이 미쳐 날뛰고 있지만 (+군더더기가 눈에 계속 거슬리지만 치우면 치울수록 하나씩 계속 보이므로 그냥 하나만 냅두겠습니다............흑흑

그래도 이정도면 가장 일반적인 형태의 C++ ElgV dij코드가 아닐까 싶습니다.

vl0612   5년 전

아 마지막으로 틀린 이유 요약

  1. INFINFINF가 뜨는 이유는 오지게 많은 오타 (코드에 주석으로 피드백했습니다)

2.결정적으로 인접리스트 방식이 아닌 인접행렬로 구현하여 메모리초과

그러합니다.

솔직히 이 상황에선 인접리스트를 인접행렬로 바꿔끼우는 것보다 <지우고 다시>가 더 공부도 되고 훨씬 편합니다...

flxl765   5년 전

흠.. 그렇군요 결국 인접리스트로 구현해야만 하는거군요...

제가 아직 초짜라 인접리스트는 뭔가 구현하기 어려워서 행렬방식으로 어떻게 할 수 없을까 했는데 메모리 오류라 ㅠㅠ

C 자료구조 배운지 반년정도밖에 안되가지고 C++은 아직 시작조차 못한 상황이라 C로 문제를 풀 수 없을까 해서 글을 올려봤습니다.

많은 도움이 된거 같아요 감사해요 ^^

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