댓글 쓰고 오류가 있어서 고치려고 했더니 수정이 안되네요 또르륵... 이건 건의해봐야겠습니다..
1753번 - 최단경로
일단 고쳐보았습니다.
제가 ->이런 거나 *이런거나 malloc pragma 하나도 모르는 사람인지라ㅋㅋㅋ 대충 코드눈치보며 고쳐보았습니다.
틀린 부분 및 없어도 되는 군더더기(당장 이 코드에서 없어도(주석처리해도) 돌아가는 부분만) 대강 표기해두었습니다.
Heap 자료구조를 직접 만들어쓰다니......ㄷㄷ 자료구조를 직접 구현할 수 있다는 점은 매우 존경스럽지만, 알고리즘 공부를 위해서라면 C++ 쓰는 것을 추천합니다.
C++에서는 priority_queue 라고 개발자들이 제공하는 훌륭한 STL이 제공됩니다. 문법 쪼끔만 공부하면 돼요.
동적배열도 stl에 있는 vector로 간단히 선언 및 여러 유용한 사용이 가능합니다
저런 어려운 문법과 자료구조 구현이 실제 프로그래밍 할 때는 도움되겠지만, 지속적이고 편안한(?) 알고리즘 공부를 위해서는 좀 더 경량화된 문법 등을 사용하는게 편리하다고 생각합니다.
(본인이 문법을 못 읽어서 하는 찡얼거림 맞습니다 ㅋㅋㅋ)
+
그리고 아래와 같이 고치면 당장 예제는 돌아가지만
제출 결과 테스트케이스에 대해서는 <메모리초과>가 나옵니다. 추가 댓글로 피드백하겠습니다.
일단, (문법도 모르면서 대충 읽어보기에) 코드의 흐름 자체는 틀린 점이 없습니다. 솔직히 해당문법에서 군더더기도 adj_mat관려된 부분밖에 없다는 점에서 (저보다 훨씬(...)) 훌륭합니다.
메모리 초과가 나는 원인
<그래프를 나타내는 방식에는 인접행렬과 인접리스트 방식이 있습니다.
그리고 위의 코드에서 사용한 방식은 아마 인접행렬로 추정되고
20000*20000 짜리 배열이 만들어지니까 메모리 가볍게 초과...
인접리스트를 사용하면 간선 개수에 비례하여 메모리를 먹으므로 30만개 정도면 굉장히 여유롭게 메모리를 사용할 수 있습니다. (128mb면 수천만개 int배열 선언이 가능하니까요)
"결론 : 지우고 다시 짜는게 편합니다."
나아가 알고리즘 대회를 위한 간단한 두가지 피드백을 드리자면
실무관련 프로그래밍 혹은 자바 쓰시는 분들은 지역변수를 주고 받고 하는 것을 사랑한다고 들었지만
알고리즘 대회에서 전역변수를 사용하면 시간적으로두, 혹은 코드의 쾌적함을 위해서라두 정말로 얻을 수 있는 점이 많습니다.
2. C++를 사용합시다 C++에 STL을 생활화합시다.
자료구조를 직접 구현할 수 있다는 점은 매우 존경스럽지만, 알고리즘 공부를 위해서라면 C++ 쓰는 것을 추천합니다.
C++에서는 priority_queue 라고 개발자들이 제공하는 훌륭한 STL이 제공됩니다. 문법 쪼끔만 공부하면 돼요.
동적배열도 stl에 있는 vector로 간단히 선언 및 여러 유용한 사용이 가능합니다
저런 어려운 문법과 자료구조 구현이 실제 프로그래밍 할 때는 도움되겠지만, 지속적이고 편안한(?) 알고리즘 공부를 위해서는 좀 더 경량화된 문법 등을 사용하는게 편리하다고 생각합니다.
(본인이 문법을 못 읽어서 하는 찡얼거림 맞습니다 ㅋㅋㅋ)
+a
조언으로
printf함수는 어느 부분에서 문제가 일어났는지 파악할 때 용이합니다.
아무 코드 중간에 printf("Hello World");를 삽입한 뒤 헬로 월드가 출력 여부에 따라 그 부분이 실행되었음을 볼 수 있습니다.
요약하자면
++
쭈그리짜그리 짜지기 전에
제 C++코드 하나를 주서고가 함께 첨부하고 사라지겠습니다.
예전에 짰던 거를 지금 살짝 군더더기만 제거한거라 변수명이 미쳐 날뛰고 있지만 (+군더더기가 눈에 계속 거슬리지만 치우면 치울수록 하나씩 계속 보이므로 그냥 하나만 냅두겠습니다............흑흑
그래도 이정도면 가장 일반적인 형태의 C++ ElgV dij코드가 아닐까 싶습니다.
댓글을 작성하려면 로그인해야 합니다.
flxl765 5년 전
최소 히프로 가중치가 적은 순서대로 정렬하도록 썼구요
while(H->heap_size != 0) 문에서 최단 거리 설정해주고
나름 신경써서 코딩했는데 출력값은
0
INF
INF
INF
INF
이렇게밖에 안떠서 멘붕왔네요;; 거의 하루종일 싸맸는데...하...