最小生成树Prim算法 Kruskal算法
Prim算法(贪心策略)N^2
选定图中任意定点v0,从v0开始生成最小生成树
树中节点Va,树外节点Vb
最开始选一个点为Va,其余Vb,
之后不断加Vb到Va最短距离的点
1.初始化d[v0]=0,其他d[i]=正无穷。d表示Vb电到i的最小距离
2.经过n次如下步骤,得到一颗喊n节点n-1边的最小生成树
(1)选择一个未标记的k,并且d[k]的值最小
(2)标记点k进入树Va
(3)以k为中间点,修改未标记的点j,即Vb中的点到Va的距离值;
3.得到最小生成树t
#include<iostream>
#include<iomanip>
#include<cstring>
using namespace std;
const int INF=0x7fffffff/;
int vst[];//标记i是否加入最小生成树Va中
int d[];//i与当前生成树中的点有连边的边长最小值
int g[][],n,m,ans=;//g存边和权值
void read(){//读入数据
int i,j,x,y,w;
cin>>n>>m;//n点m边
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
g[i][j]=INF;//清零
for(i=;i<=m;i++){
cin>>x>>y>>w;
g[x][y]=g[y][x]=w;//记录边和权值
}
}
void prim(int v0){
int i,j,k,minn;
memset(vst,,sizeof(vst));
for(i=;i<=n;i++) d[i]=INF;//初始化
d[v0]=;//最初节点
ans=;
for(i=;i<=n;i++){//选择n个点
minn=INF;
for(j=;j<=n;j++)//选择最小边 ,Vb到Va
if(vst[j]==&&minn>d[j]){
minn=d[j];k=j;
}
vst[k]=;//标记 ,加入到Va
ans+=d[k];//加上边的权值
for(j=;j<=n;j++)//修改d数组
if(vst[j]==&&d[j]>g[k][j])
d[j]=g[k][j];
}
}
int main(){
read();
prim();
cout<<ans<<endl;
return ;
}
Kruskal算法(贪心策略)nlogn
算法步骤:
1.将G中的带权边由小到大排序
2.按照权值由小到大依次选边。诺形成环就放弃这一条,否则标记当前边并计数;
3.重复2.直到生成树有n-1条边。
否则遍历完边取不到n-1,就不存在最小生成树。
***如何判断环:用并查集:判断新加入的边的两个端点如果在并查集同一集合则成环;
否则保存当前边,并合并涉及的两个集合。
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=;
struct edge{
int x,y,z;
}a[maxn];
int n,m,prt[maxn],ans=,bj;
bool cmp(const edge &x,const edge &y){
return x.z<y.z;
}
int getfather(int x){//找祖先
if(prt[x]==x) return x;
prt[x]=getfather(prt[x]);
return prt[x];
}
void kruskal(){//核心程序
int f1,f2,k,i;
k=;//记录已经加入的边数
for(i=;i<=n;i++) prt[i]=i;//初始化
for(i=;i<=m;i++){
f1=getfather(a[i].x);//并查集??不太懂
f2=getfather(a[i].y);
if(f1!=f2){
ans+=a[i].z;
prt[f1]=f2;//合并不相同的两个集合
k++;
if(k==n-) break;
}
}
if(k<n-){
cout<<"Impossible"<<endl;bj=;
return ;
}
}
int main(){
cin>>n>>m;
ans=;bj=;
for(int i=;i<=m;i++)
cin>>a[i].x>>a[i].y>>a[i].z;
sort(a+,a+m+,cmp);
kruskal();
if(bj) cout<<ans<<endl;
return ;
}
最小生成树Prim算法 Kruskal算法的更多相关文章
- 无向带权图的最小生成树算法——Prim及Kruskal算法思路
边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权. 最小生成树(MST):权值最小的生成树. 生成树和最小生成树的应用:要连通n个城市需要n-1条边线路.可以 ...
- [数据结构]最小生成树算法Prim和Kruskal算法
最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树. 例如,对于如上图G4所示的连通网可以有多棵权值总 ...
- 图的最小生成树的理解和实现:Prim和Kruskal算法
最小生成树 一个连通图的生成树是一个极小的连通子图,它含有图中所有的顶点,但只有足以构成一棵树的n-1条边.我们将构造连通网的最小代价生成树称为最小生成树(Minimum Cost Spanning ...
- 最小生成树(Prim算法+Kruskal算法)
什么是最小生成树(MST)? 给定一个带权的无向连通图,选取一棵生成树(原图的极小连通子图),使生成树上所有边上权的总和为最小,称为该图的最小生成树. 求解最小生成树的算法一般有这两种:Prim算法和 ...
- hdu 1233 还是畅通工程 最小生成树(prim算法 + kruskal算法)
还是畅通工程 Time Limit: 4000/2 ...
- 最小生成树 Prim算法 Kruskal算法实现
最小生成树定义 最小生成树是一副连通加权无向图中一棵权值最小的生成树. 在一给定的无向图 G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边(即,而 w(u, v) 代表此边的 ...
- 算法(图论)——最小生成树及其题目应用(prim和Kruskal算法实现)
题目 n个村庄间架设通信线路,每个村庄间的距离不同,如何架设最节省开销? Kruskal算法 特点 适用于稀疏图,时间复杂度 是nlogn的. 核心思想 从小到大选取不会产生环的边. 代码实现 代码中 ...
- 【431】Prim 算法 & Kruskal 算法
Prim 算法: Minimum Spanning Tree(MST):最小生成树,就是连接所有节点的最小权值 mst集合与rest集合 mst集合中顶点,找到一条最小权值的边 然后把边相关的顶点,选 ...
- 最小生成树之算法记录【prime算法+Kruskal算法】【模板】
首先说一下什么是树: 1.只含一个根节点 2.任意两个节点之间只能有一条或者没有线相连 3.任意两个节点之间都可以通过别的节点间接相连 4.除了根节点没一个节点都只有唯一的一个父节点 5.也有可能是空 ...
随机推荐
- C# Stopwatch
问题一:前几天写并行计算的实际应用——通讯录的时候,用到了stopwatch来计时,发现这个计时是真正的计时. Stopwatch stopwatch = new Stopwatch(); TimeS ...
- POJ - 1330 Nearest Common Ancestors(dfs+ST在线算法|LCA倍增法)
1.输入树中的节点数N,输入树中的N-1条边.最后输入2个点,输出它们的最近公共祖先. 2.裸的最近公共祖先. 3. dfs+ST在线算法: /* LCA(POJ 1330) 在线算法 DFS+ST ...
- 并不对劲的uoj276. [清华集训2016]汽水
想要很对劲的讲解,请点击这里 题目大意 有一棵\(n\)(\(n\leq 50000\))个节点的树,有边权 求一条路径使该路径的边权平均值最接近给出的一个数\(k\) 输出边权平均值下取整的整数部分 ...
- 并不对劲的bzoj3277
陈年老坑 题意大概是有n个字符串,要求出每一个字符串的所有子串(不包括空串)在所有字符串(包括自身)中出现次数不少于k的有多少个.n,k,字符串总长<=100000. 如果只有一个串的话,非常好 ...
- ThreadLocal工具类的使用(隔离思想)
ThreadLocal不是用来解决共享对象的多线程访问问题的, 通过ThreadLocal的set()方法设置到线程的ThreadLocal.ThreadLocalMap里的是是线程自己要存储的对象, ...
- 关于eclipse部署项目后,在tomcat中的webapps文件夹下没有项目
转自:https://blog.csdn.net/yang505581644/article/details/78802316 一.发现问题 在eclipse中新建Dynamic Web Projec ...
- Oracle第三方ado.net数据提供程序(转)
原文地址:http://www.infoq.com/cn/news/2009/06/oracleclient_deprecated 这项决定有部分原因是基于目前Oracle的第三方ADO.NET数据提 ...
- (转)ASP.NET 4.0 尚未在 Web 服务器上注册
安装vs2010的时候忘记先安装IIS7了,导致出现了这个问题.经过网络查询发现解决方法如下: 运行:cmd命令,进入命令管理器, 输入:cd C:\\WINDOWS\\Microsoft.NET\\ ...
- WordPress xmlrpc.php flaw exploited to install a WSO 2.1 Web Shell by oRb
WordPress xmlrpc.php flaw exploited to install a “WSO 2.1 Web Shell by oRb” Below you can see in the ...
- vi常用设置
vi不能使用退格键和上下左右键 因为ubuntu默认安装的是vim-tiny,所以需要安装完整版本 apt-get install vim 安装完再使用就可以了 vi本身是不带颜色的,vim带颜色,使 ...