普里姆算法实现(邻接矩阵无向网)

#include <iostream>
#include <C:\Users\chenyi\OneDrive\c_work_space\A_数据结构调用\无向网\main.cpp>
//此处调用见底端无向网链接,自行整合
using namespace std;

int LocateVex(AMGraph G,VerTexType v);


/**辅助数组,存储最小边与值*/
struct CLOSE{
    VerTexType adjvex;
    ArcType lowcost;
}closedge[MVNum];

int Min(struct CLOSE closedge);

/**普里姆算法,u是定点,从他出发*/
void MiniSpanTree_Prim(AMGraph G,VerTexType u){
    cout<<"a-a"<<endl;
    int k = LocateVex(G,u); //u点所在的位置传递给k
    cout<<k<<endl;
    for(int j=0;j<G.vexnum;j++){
        if(j!=k) closedge[j] = {u,G.arcs[k][j]}; //给closedge做一个初始化,k为起点
        cout<<closedge[j].adjvex<<","<<closedge[j].lowcost<<"丨";
    }
    cout<<endl<<"point and weight"<<endl;
    closedge[k].lowcost = 0;//自己到自己长度肯定是0;
    for(int i=1;i<G.vexnum;i++){
        //k = Min(*closedge);
        int weight = MaxInt;
        for(int z=0;z<G.vexnum;z++){
            if(closedge[z].lowcost!=0&&closedge[z].lowcost<=weight){
                k = z;//k是位置坐标
                weight = closedge[z].lowcost;
            }
        }
        //cout<<"min pos:"<<k<<" ,and the weight : "<<weight<<endl;
        VerTexType v1,v2;//v1是访问过的,v2是没有访问过的
        v1 = closedge[k].adjvex;
        v2 = G.vexs[k];
        //cout<<"the point: "<<v1<<" "<<v2<<" "<<G.arcs[LocateVex(G,v1)][LocateVex(G,v2)]<<endl;
        for(int j=0;j<G.vexnum;j++){
            cout<<closedge[j].adjvex<<","<<closedge[j].lowcost<<"丨";
        }
        cout<<" "<<v1<<" "<<v2<<endl;
        closedge[k].lowcost = 0;
        for(int j=0;j<G.vexnum;j++){  //替换掉比上一届大的值
            if(G.arcs[k][j]<closedge[j].lowcost){
                closedge[j] = {G.vexs[k],G.arcs[k][j]};
            }
        }
    }
}



int main()
{
    AMGraph amg;

    CreatUDN(amg); //创建无向网络
    UDN_dis(amg);  //显示无向网!
    MiniSpanTree_Prim(amg,'1');
    return 0;
}

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

//int Min(struct CLOSE){
//    ;
//}

/**
6 10
1 2 3 4 5 6
1 2 6
1 4 5
1 3 1
2 3 5
3 4 5
4 6 2
2 5 3
3 5 6
3 6 4
5 6 6
*/

 

无向网

转载于:https://my.oschina.net/lafter/blog/911289

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值