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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #include <stdio.h> #define TRUE 1 #define FALSE 0 #define MAX_VERTICES 7 #define INF 1000L int weight[MAX_VERTICES][MAX_VERTICES]={ {0,29,INF,INF,INF,10,INF}, {29,0,16,INF,INF,INF,15 }, {INF,16,0,12,INF,INF,INF}, {INF,INF,12,0,22,INF,18}, {INF,INF,INF,22,0,27,25}, {10,INF,INF,INF,27,0,INF}, {INF,15,INF,18,25,INF,0}}; int selected[MAX_VERTICES]; int dist[MAX_VERTICES]; // 최소 dist[v] 값을 갖는 정점을 반환 int get_min_vertex(int n) { int v,i; for ( i=0; i<n; i++ ) if (!selected[i]) { v = i ; break; } for (i=0 ; i<n ; i++) if (!selected[i] && (dist[i] < dist[v])) v=i; return (v); } // void prim(int s, int n) { int i,u,v; for (u=0 ; u<n ; u++); {dist[u]=INF;selected[u]=FALSE;} dist[s]=0; for(i=0; i<n ; i++){ u = get_min_vertex(n); selected[u]=TRUE; if( dist[u] == INF ) return; printf ("%d",u); for (v=0; v<n ; v++) if ( weight[u][v] != INF) if( !selected[v] && weight[u][v] < dist[v] ) | cs |
아직 코드 읽는게 안 익숙해서 get_min_vertex 함수에서 !selected[i] 가 무슨 뜻인지 긴가민가해서 구글링으로 검색하려고 보니까
'selected[i]가 초기화도 안되있는데 뭔 개떡같은 코드를 쓴거냐' 하는 어리석은 아이디어(역시 아는것만 보임;;개허접;;)로 5분정도 시간 날리다가 빡쳐서 일단 넘어감.
근데 밑에 prim 함수에서 dist[]랑 selected[]를 define 한 상수로 초기화시키는걸 보고
'이쉬방ㅇㅠ 요있었네ㅠ' 하면서 다시 get_min_vertex 함수로 가서 해석하기 시작함. 근데 해석해서 결론은 리턴이 0인데, 이게 prim함수에서만 초기화한거니까 결국 get_min_vertex함수는 현재로서는 prim 안에서만 쓸 수 있네 라고 깨달음..
여기서 1차 분노 > 그럴거면 get_min_vertex를 prim 밑에다 둬야지 나같은 프늅이들이 안 헷갈려하고, 숙련자(애초에 숙련자들은 안 보겠지마느.,ㅡ)들이 봐도 불편하지는 않으니까 밑에다 두는 게 낫지 않나 혼자 생각함
그리고 그 후로 쭉쭉 진행함
근데
if( !selected[v] && weight[u][v] < dist[v] )
여기 부분에서 다시 막힘
이유는 u=get_min_vertex(n) 부분을 보고, 다시 get_min_vertex로 돌아간 다음, 그제서야 get_min_vertex 함수의 의미를 이해하고 속으로 화내다가
위에서 이미 dist[]를 INF로 초기화 를 했었다는 걸 까먹고, '아니 정의도 안 된 dist[v]를 어떻게 하라는거야 X같네' 한 20분 동안 코드만 봄ㅋㅋㅋㅋ
그러다가 너무 화가 나서 프형들한테 도움을 청하려고 Color Scripter 에다가 분노의 책보고 베껴쓰기를 하는 도중 dist[]를 이미 초기화 했다는 걸 발견
Color Scripter에다가 쓴거 아까워서 여기다 붙여봄ㅎㅎ
결론 : 한 1시간 반 넘게 개뻘짓 한 후기임다ㅎㅎ 너무 허탈해서 이건 꼭 올려야겠다는 마음의 불평불만임다ㅎㅎ
작년 2학기에 짜봤는데 그새 까먹었네