圖-普利姆算法

普利姆算法

#include <iostream>

using namespace std;

typedef char VerTexType;
typedef int ArcType;
#define MVNum 100
#define MaxInt 32767

struct {
    VerTexType adjvex;
    ArcType lowcost;
}closedeg[MVNum];

typedef char VerTexType;
typedef int ArcType;
typedef struct {
    VerTexType vexs[MVNum];
    ArcType arcs[MVNum][MVNum];
    int vexnum, arcnum;
}AMGraph;

int LocateVex(AMGraph G, VerTexType v) {
    for (int i = 0;i < G.vexnum;++i) {
        if (G.vexs[i] == v)
            return i;
    }
    return -1;
}

void CreateUDN(AMGraph& G) {
    int i, j, k;
    cout << "請(qǐng)輸入總頂點(diǎn)數(shù),總邊數(shù),以空格隔開:";
    cin >> G.vexnum >> G.arcnum;
    cout << endl;

    cout << "輸入點(diǎn)的名稱,如a" << endl;

    for (i = 0;i < G.vexnum;++i) {
        cout << "請(qǐng)輸入第" << (i + 1) << "個(gè)點(diǎn)的名稱:";
        cin >> G.vexs[i];
    }
    cout << endl;

    for (i = 0;i < G.vexnum;i++) {
        for (j = 0;j < G.vexnum;++j) {
            G.arcs[i][j] == MaxInt;
        }
    }
    cout << "輸入邊依附的頂點(diǎn)及權(quán)值,如a b 5"<<endl;
    for (k = 0;k < G.arcnum;++k) {
        VerTexType v1, v2;
        ArcType w;
        cout << "請(qǐng)輸入第" << (k + 1) << "條邊依附的頂點(diǎn)及權(quán)值:";
        cin >> v1 >> v2 >> w;
        i = LocateVex(G, v1);
        j = LocateVex(G, v2);
        G.arcs[i][j] = w;
        G.arcs[j][i] = G.arcs[i][j];
    }
}

int Min(AMGraph G) {
    int i;
    int index = -1;
    int min = MaxInt;
    for (i = 0;i < G.vexnum;++i) {
        if (min > closedeg[i].lowcost&& closedeg[i].lowcost != 0) {
            min = closedeg[i].lowcost;
            index = i;
        }
    }
    return index;
}

void MinSpanTree_Prim(AMGraph G, VerTexType u) {
    int i, j, k;
    VerTexType u0, v0;
    k = LocateVex(G, u);
    for (j = 0;j < G.vexnum;++j) {
        if (j != k) {
            closedeg[j].adjvex = u;
            closedeg[j].lowcost = G.arcs[k][j];
        }
    }
    closedeg[k].lowcost = 0;
    for (i = 1;i < G.vexnum;++i) {
        k = Min(G);
        u0 = closedeg[k].adjvex;
        v0 = G.vexs[k];
        cout << "邊  " << "--->" << v0 << endl;
        closedeg[k].lowcost = 0;
        for (j = 0;j < G.vexnum;++j) {
            if (G.arcs[k][j] < closedeg[j].lowcost) {
                closedeg[j].adjvex = G.vexs[k];
                closedeg[j].lowcost = G.arcs[k][j];
            }
        }
    }
}

int main() {
    cout << "普里姆算法" << endl;
    AMGraph G;
    CreateUDN(G);
    cout << endl;
    cout << "無向圖G創(chuàng)建完成!" << endl;

    cout << "利用普里姆算法構(gòu)造最小生成樹結(jié)果:" <<endl
        ;
    MinSpanTree_Prim(G, '0');
    cout << endl;
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容