2016.7.15感想
2016-07-15 18:09
260 查看
2016.7.15
关于最小生成树,在极小连通中删除一个边就不再连通了,添加一条边,有必定成环的一种树。它来可来求,每个地方都连通起来的最小权值。我们来求这种最小生成树现在已会两种求法:
prim算法: 原理:设G=(V,E)是一个有向连通图
U是顶点集V的一个子集
如果:1、边(u,v)
, u∈U且v∈(V-U),一个顶点在U中、另一个端点不在U中
2、(u,v)是满足条件1最小权值的边
那么
一定存在G的一棵最小生成树包含(u,v)
代码如下:
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算出来的距离
相关文章推荐
- Web API 强势入门指南
- android视频播放之JieCaoVideoPlayer全能播放器
- Lua基础[持续更新]
- Spring MVC DispatcherServlet
- elasticsearch使用操作部分
- 关闭多实例MySQL时报错
- hbase客户端源码分析调用
- Android的Drawable
- eclipse 创建maven项目设置默认jdk版本
- Yii调试查看执行SQL语句的方法
- socket长连接
- 结合上面的五个例子,对类的静态成员变量和成员函数作个总结: 一。静态成员函数中不能调用非静态成员。 二。非静态成员函数中可以调用静态成员。因为静态成员属于类本身,在类的对象产生之前就已经存在了,所
- 安卓-Handler引起的内存泄漏
- 常用的异步线程
- 【NFC】在Android中访问内置SE和基于SE的卡模拟
- URAL 1873 大阅读题
- 深入理解JVM—JVM内存模型
- 函数getopt(),及其参数optind
- 自动生成
- 程序对拍方法