记录_prime最小生成树

prime核心:找已知 起点 到 各个节点 的最小权,在其中找最小值,将点设为已访问,用该点进行搜索,更新未访问的点的权(最小),直到访问完所有点。
 

 const int size=9;

    const int MAX=1000000;

    int map[size][size]={

{ 0,4,MAX,MAX,MAX,MAX,MAX,8,MAX },

{ 4,0,8,MAX,MAX,MAX,MAX,11,MAX },

{ MAX,8,0,7,MAX,4,MAX,MAX,2 },

{ MAX,MAX,7,0,9,14,MAX,MAX,MAX },

{ MAX,MAX,MAX,9,0,10,MAX,MAX,MAX },

{ MAX,MAX,4,14,10,0,2,MAX,MAX },

{ MAX,MAX,MAX,MAX,MAX,2,0,1,6 },

{ 8,11,MAX,MAX,MAX,MAX,1,0,7 },

{ MAX,MAX,2,MAX,MAX,MAX,6,7,0 }

};

    int visit[size];

    int mincost[size];

    int father[size];

    int root=0;

    int minpath=0;

    for(int i=0;i<size;i++){

        mincost[i]=map[root][i];

        visit[i]=0;

        father[i]=0;

    }

    visit[root]=1;

    int searchroot=root;

    for(int i=1;i<size;i++){//起始点已访问

        int minint=MAX;

        for(int j=0;j<size;j++){

            if((!visit[j])&&mincost[j]<minint){//找队列里的最小值做下一个顶点

                minint=mincost[j];

                searchroot=j;

            }

        }

        minpath+=minint;

        visit[searchroot]=1;

        for(int j=0;j<size;j++){

            if((!visit[j])&&mincost[j]>map[searchroot][j]){//找各个边的最小值更新最小权值

                mincost[j]=map[searchroot][j];

                father[j]=searchroot;

            }

        }

    }

    for(int i=1;i<size;i++){

        int lo=i;

        while(lo){

            cout<<(char)(lo+'a')<<" <-- ";

            lo=father[lo];

        }

        cout<<'a'<<endl;

    }

    cout<<"minimal path is "<<minpath<<endl;

核心:找已知的最小权 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值