在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ 數(shù)據(jù)分析&挖掘/ prim算法 上
hash表
單詞統(tǒng)計(jì)
鏈表排序
查找
可變參數(shù)
爬樓梯
內(nèi)存
prim算法 中
線性結(jié)構(gòu)的處理
數(shù)據(jù)選擇
prim算法 上
循環(huán)單向鏈表
基數(shù)排序
堆排序
鏈表重合
排序二叉樹的保存和加載
圖添加和刪除
排序二叉樹線索化
非遞歸排序
字符串查找 下篇
鏈表逆轉(zhuǎn)
函數(shù)堆棧顯示
遞歸和堆棧
二叉樹深度遍歷
線性隊(duì)列
循環(huán)和遞歸
快速排序
尋找丟失的數(shù)
A*算法
克魯斯卡爾算法 下
排序二叉樹
大數(shù)計(jì)算
二叉樹廣度遍歷
prim算法 下
洗牌算法
圖結(jié)構(gòu)
最大公約數(shù)、最小公倍數(shù)
圖創(chuàng)建
雙向鏈表
字符串查找 上篇
尋路
通用算法的編寫
哈夫曼樹 下
線性堆棧
八皇后
排序二叉樹刪除-1
挑選最大的n個(gè)數(shù)
字符串查找 中篇
哈夫曼樹 上
合并排序
回?cái)?shù)
選擇排序
哈希二叉樹
通用數(shù)據(jù)結(jié)構(gòu)
“數(shù)星星”
單向鏈表
排序二叉樹插入
圖的保存
排序二叉樹刪除-2
排序二叉樹刪除-3
n!中末尾零的個(gè)數(shù)統(tǒng)計(jì)

prim算法 上

前面我們討論了圖的創(chuàng)建、添加、刪除和保存等問題。今天我們將繼續(xù)討論圖的一些其他問題,比如說如何在圖的環(huán)境下構(gòu)建最小生成樹。為什么要構(gòu)建最小生成樹呢?其實(shí)原理很簡單。打個(gè)比方,現(xiàn)在某一個(gè)鄉(xiāng)鎮(zhèn)有n個(gè)村,那么這n個(gè)村肯定是聯(lián)通的?,F(xiàn)在我們打算在各個(gè)村之間搭建網(wǎng)線,實(shí)現(xiàn)村村通的工程。那么有什么辦法可以實(shí)現(xiàn)村村互通,同時(shí)又使得最后的總距離最小呢?要達(dá)到這個(gè)目的,就必須在已有的圖中構(gòu)建最小生成樹。

生成最小生成樹的方法很多,prim方法就是其中的一種。那么生成最小生成樹的基本步驟是什么呢?很簡單,聽我慢慢道來:

1)以某一個(gè)點(diǎn)開始,尋找當(dāng)前該點(diǎn)可以訪問的所有的邊;

2)在已經(jīng)尋找的邊中發(fā)現(xiàn)最小邊,這個(gè)邊必須有一個(gè)點(diǎn)還沒有訪問過,將還沒有訪問的點(diǎn)加入我們的集合,記錄添加的邊;

3)尋找當(dāng)前集合可以訪問的所有邊,重復(fù)2的過程,直到?jīng)]有新的點(diǎn)可以加入;

4)此時(shí)由所有邊構(gòu)成的樹即為最小生成樹。

那么,代碼應(yīng)該怎么編寫呢?朋友們可以自己好好思考一下。

a)首先,我們定義基本的數(shù)據(jù)結(jié)構(gòu)。

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;
}
上一篇:二叉樹廣度遍歷下一篇:排序二叉樹