【 聲明:著作權,歡迎轉載,請勿用於商業用途。 聯絡信箱:feixiaoxing @163.com】
前面我們討論了圖的建立、添加、刪除和儲存等問題。今天我們將繼續討論圖的一些其他問題,比如說如何在圖的環境下構建最小產生樹。為什麼要構建最小產生樹呢?其實原理很簡單。打個比方,現在某一個鄉鎮有n個村,那麼這n個村肯定是聯通的。現在我們打算在各個村之間搭建網線,實現村村通的工程。那麼有什麼辦法可以實現村村互連,同時又使得最後的總距離最小呢?要達到這個目的,就必須在已有的圖中構建最小產生樹。
產生最小產生樹的方法很多,prim方法就是其中的一種。那麼產生最小產生樹的基本步驟是什麼呢?很簡單,聽我慢慢道來:
1)以某一個點開始,尋找當前該點可以訪問的所有的邊;
2)在已經尋找的邊中發現最小邊,這個邊必須有一個點還沒有訪問過,將還沒有訪問的點加入我們的集合,記錄添加的邊;
3)尋找當前集合可以訪問的所有邊,重複2的過程,直到沒有新的點可以加入;
4)此時由所有邊構成的樹即為最小產生樹。
那麼,代碼應該怎麼編寫呢?朋友們可以自己好好思考一下。
a)首先,我們定義基本的資料結構。
typedef struct _DIR_LINE{int start;int end;int weight;struct _DIR_LINE* next;}DIR_LINE;typedef struct _MINI_GENERATE_TREE{int node_num;int line_num;int* pNode;DIR_LINE* pLine;}MINI_GENERATE_TREE;
b)DIR_LINE的基本操作
STATUS insert_line_into_queue(DIR_LINE** ppLine, int start, int end, int weight){DIR_LINE* pLine;if(NULL == ppLine)return FALSE;if(NULL == *ppLine){*ppLine = create_new_dir_line(start, end, weight);return TRUE;}pLine = create_new_dir_line(start, end, weight);pLine->next = *ppLine;*ppLine = pLine;return TRUE;}STATUS delete_line_from_queue(DIR_LINE** ppLine, DIR_LINE* pLine){DIR_LINE* prev;if(NULL == ppLine || NULL == *ppLine || NULL == pLine)return FALSE;if(pLine == *ppLine){*ppLine = pLine->next;goto final;}prev = *ppLine;while(pLine != prev->next)prev = prev->next;prev->next = pLine->next;final:free(pLine);return TRUE;}
【未完,待續】