2016.7.15感想

2016.7.15

关于最小生成树,在极小连通中删除一个边就不再连通了,添加一条边,有必定成环的一种树。它来可来求,每个地方都连通起来的最小权值。

 我们来求这种最小生成树现在已会两种求法:

 prim算法: 原理:设G=(VE)是一个有向连通图

U是顶点集V的一个子集

如果:1、边(uv) u∈Uv∈(V-U)一个顶点在U中、另一个端点不在U

2(uv)是满足条件1最小权值的边

  那么

一定存在G的一棵最小生成树包含(uv)

代码如下:

memset(minn,127,sizeof(minn);

For(i=1;i<=n;i++) minn[i]=map[1][i];

minn[1]=0;vis[1]=1;

for(i=1;i<=n-1;i++){

      min=INT_MAX;

       t=0;

       for(j=2;j<=n;j++){

          if(!vis[j]&& minn[j]<min){

              t=j; min=minn[j];

          }                 

       }

       vis[t]=1;

        sum+=min;

        for(j=2;j<=n;j++){

          if((!vis[j] &&minn[j]>map[t][j]){

              minn[j]=map[t][j];

          }                   

    }

}

还有一个就是关于Kruskal算法

这个算法原理就很直接 每次把权值最小的给放在一个集合里,但是不能成环即不能在一个连通图中。(一个判断条件)

直到达到所要求的边即n个点 n-1条边为止;

算法描述:

1.初始化并查集。father[x]=x。

2.tot=0
3.将所有边用快排从小到大排序。
4.计数器 k=0;
5.for (i=1; i<=M; i++)      //循环所有已从小到大排序的边

  if  这是一条u,v不属于同一集合的边(u,v)(因为已经排序,所以必为最小),

    {

     ①合并u,v所在的集合,相当于把边(u,v)加入最小生成树。

    ②tot=tot+W(u,v)

      ③k++

      ④如果k=n-1,说明最小生成树已经生成,则break;

    }

6.结束,tot即为最小生成树的总权值之和。

扩展:次最小生成树、

prim是每次增加一个结点s, 在此需要保存节点和其父节点

最大权

要么是新加入的

要么是父节点到起始点的采用DP算出来的距离





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值