最小生成树(prim)算法

算法描述:

    1:输入:一个加权连通图,其中顶点集合为V,边集合为E;

    2:初始化:Vnew = {x},其中x为集合V中的任一节点(起始点),Enew = {},为空

    3: 重复下列操作,直到Vnew = V:

                a.在集合E中选取权值最小的边<u, v>,其中u为集合Vnew中的元素,

               而v不在Vnew集合当中,并且v∈V(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之一);

               b.将v加入集合Vnew中,将<u, v>边加入集合Enew中;

    4:输出:使用集合Vnew和Enew来描述所得到的最小生成树。

简单点说

    设顶点集合为V,最小生成树集合为S,初始化S为空,V为全部顶点的集合,

    第一步:  把定点1从V集合拿到S集合

   重复一下操作:

                        从S-V中选择一点到V集合最短的边,加入到集合S,

                       更新V集合到S集合各点的最短路

   以上操作直到S=V

上代码

	
void init1()
{
    scanf("%d%d", &N, &M);
    int Start, End, val;
    for (int i = 0; i <= N; i++) {
        for (int j = 1; j <= N; j++) {
	    maps[i][j] = 1000000;//初始化
	}
    }
    for (int i = 0; i < M; i++) {
	scanf("%d%d%d", &Start, &End, &val);
	maps[Start][End] = val;//无向图所以这样赋值
	maps[End][Start] = val;
   }
}

//prim算法
void prim()
{   
    int dis[1000];
    int vis[1000];
    memset(vis,0,sizeof(vis));
    int i,j,k,tmp,ans;
    for(i = 1; i <= N; i++) {
	dis[i] = 100000;//初始化 
    }
    dis[1]=0;
    for(i = 1; i <= N; i++){
	tmp=1000000;
	for(j = 1;j <= N; j++){
	    if(!vis[j] && tmp>dis[j]){
                tmp = dis[j];								
		k = j;
	    }//找出最小距离的节点 
	}
	vis[k] = 1;//把访问的节点做标记
	pResult += tmp;
	for(j = 1;j <= N; j++){
	    if(!vis[j] && dis[j] > maps[k][j]) {
		dis[j] = maps[k][j];//更新最短距离
	    }
	}
    }	
}

int main()
{
    init1();
    printf("M:%d, N:%d\n", M,N);
    prim();		
    printf("%d\n", pResult);
    return 0;
}


//1 2 6
//
//1 3 1
//
//1 4 5
//
//2 3 5
//
//2 5 3
//
//3 4 5
//
//3 5 6
//
//3 6 4
//
//4 6 2
//
//5 6 6

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

breakpoints_

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值