prim算法,克鲁斯卡尔算法---最小生成树
最小生成树的一个作用,就是求最小花费。要在n个城市之间铺设光缆,主要目标是要使这 n 个城市的任意两个之间都可以通信,但铺设光缆的费用很高,且各个城市之间铺设光缆的费用不同,因此另一个目标是要使铺设光缆的总费用最低。这就需要找到带权的最小生成树。
主要思路:贪心,假设一共有五个点,按道理来讲,应该是先找到图中最小权值的两个点没然后对剩余的点进行遍历。但是也可以任意指定一个点。可以任意指定的原因就是,如果给定的信息可以构成最小生成树的话,那么最小生成树中一定有所有的点,那么这个点也一定在树上,所以可以任意指定一个点进行循环。指定第一个点后,然后寻找其他还没有访问的点到该点的最小距离,找到之后,将该点放入已经访问过的集合中,然后再找剩下的未访问的点到已经访问的这一坨中的点的最小距离,然后不停的循环这个过程,知道所有的点都访问为止。(如果是最大生成树的话,直接改克鲁斯卡尔中的sort就可以了,最小生成树是升序,最大生成树就是降序)
例题:http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/2144.html
代码:(Prim)
#include<iostream>
#include<cstring>
#include<string>
#include<iomanip>
#include<map>
#include<queue>
#include<stack>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
# define maxn 1005
# define inf 0x3f3f3f3f
int a[maxn][maxn];
int dis[maxn];
int n,m;
int vis[maxn];
int flag;
int prime()
{
for(int i=1; i<=n; i++)
dis[i]=a[i][1];//首先把除了1之外的点的距离到1的距离存好
memset(vis,0,sizeof(vis));//标记数组
vis[1]=1;
int temp,k;
int sum=0;//计算权值和
for(int i=1; i<n; i++)
{
temp=inf;
for(int j=1; j<=n; j++)
{
if(vis[j]==0&&dis[j]<temp)//寻找剩余的点到已经访问过的集合中的距离的最小值
{
temp=dis[j];
k=j;
}
}
if(temp==inf)//如果这个点连不到图上,说明根本无法构成图,直接退出即可
{
flag=1;
break;
}
sum+=temp;
vis[k]=1;//将下一个点标记
for(int j=1; j<=n; j++)
{
if(vis[j]==0&&dis[j]>a[k][j])//dis数组存的不只是剩余的点到k点的最小距离,还应该是剩余的点到已经访问过的点的u最小距离。
{
dis[j]=a[k][j];
}
}
}
return sum;
}
int main()
{
while(cin>>n>>m)
{
memset(a,inf,sizeof(a));//首先对存图的数组进行初始化
for(int i=1; i<=n; i++)
{
a[i][i]=0;
}//自己到自己的距离是0
flag=0;
for(int i=1; i<=m; i++)
{
int u,v,w;
cin>>u>>v>>w;
if(a[u][v]>w)//防止有重边
{
a[v][u]=a[u][v]=w;
}
}
int t=prime();
if(m<n-1||flag==1)cout<<0<<endl;//如果,有的点连不到图上,或者给定的信息根本无法构成图,则输出0
else
{
cout<<t<<endl;
}
}
return 0;
}
克鲁斯卡尔算法:
#include<iostream>
#include<iomanip>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<algorithm>
using namespace std;
# define maxn 10000+10
int n,m;
struct node
{
int x,y,cost;
} edge[maxn];
int father[maxn];
int Find(int t)
{
return father[t]==t? t: father[t]=Find(father[t]);
}
bool cmp(node t1,node t2){
return t1.cost<t2.cost;
}
int kruskal()
{
for(int i=1; i<=n; i++)
{
father[i]=i;
}
int sum=0;
sort(edge+1,edge+m+1,cmp);
for(int i=1; i<=m; i++)
{
int t1=Find(edge[i].x);
int t2=Find(edge[i].y);
if(t1!=t2)
{
sum+=edge[i].cost;
father[t1]=t2;
}
}
return sum;
}
int main()
{
while(cin>>n>>m)
{
for(int i=1; i<=m; i++)
{
cin>>edge[i].x>>edge[i].y>>edge[i].cost;
}
int t=kruskal();
cout<<t<<endl;
}
return 0;
}
prim算法,克鲁斯卡尔算法---最小生成树的更多相关文章
- 最小生成树--克鲁斯卡尔算法(Kruskal)
按照惯例,接下来是本篇目录: $1 什么是最小生成树? $2 什么是克鲁斯卡尔算法? $3 克鲁斯卡尔算法的例题 摘要:本片讲的是最小生成树中的玄学算法--克鲁斯卡尔算法,然后就没有然后了. $1 什 ...
- 最小生成树---普里姆算法(Prim算法)和克鲁斯卡尔算法(Kruskal算法)
普里姆算法(Prim算法) #include<bits/stdc++.h> using namespace std; #define MAXVEX 100 #define INF 6553 ...
- 最小生成树之Kruskal(克鲁斯卡尔)算法
学习最小生成树算法之前我们先来了解下下面这些概念: 树(Tree):如果一个无向连通图中不存在回路,则这种图称为树. 生成树 (Spanning Tree):无向连通图G的一个子图如果是一颗包含G的所 ...
- 算法与数据结构(五) 普利姆与克鲁斯卡尔的最小生成树(Swift版)
上篇博客我们聊了图的物理存储结构邻接矩阵和邻接链表,然后在此基础上给出了图的深度优先搜索和广度优先搜索.本篇博客就在上一篇博客的基础上进行延伸,也是关于图的.今天博客中主要介绍两种算法,都是关于最小生 ...
- 贪心算法(Greedy Algorithm)之最小生成树 克鲁斯卡尔算法(Kruskal's algorithm)
克鲁斯卡尔算法(Kruskal's algorithm)是两个经典的最小生成树算法的较为简单理解的一个.这里面充分体现了贪心算法的精髓.大致的流程能够用一个图来表示.这里的图的选择借用了Wikiped ...
- hdu 1233(还是畅通project)(prime算法,克鲁斯卡尔算法)(并查集,最小生成树)
还是畅通project Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- 贪心算法(Greedy Algorithm)最小生成树 克鲁斯卡尔算法(Kruskal's algorithm)
克鲁斯卡尔算法(Kruskal's algorithm)它既是古典最低的一个简单的了解生成树算法. 这充分反映了这一点贪心算法的精髓.该方法可以通常的图被表示.图选择这里借用Wikipedia在.非常 ...
- 图->连通性->最小生成树(克鲁斯卡尔算法)
文字描述 上一篇博客介绍了最小生成树(普里姆算法),知道了普里姆算法求最小生成树的时间复杂度为n^2, 就是说复杂度与顶点数无关,而与弧的数量没有关系: 而用克鲁斯卡尔(Kruskal)算法求最小生成 ...
- 最小生成树——Kruscal(克鲁斯卡尔算法)
一.核心思想 将输入的数据由小到大进行排序,再使用并查集算法(传送门)将每个点连接起来,同时求和. 个人认为这个算法比较偏向暴力,有些题可能会超时. 二.例题 洛谷-P3366 题目地址:ht ...
随机推荐
- BZOJ4001[TJOI2015]概率论——卡特兰数
题目描述 输入 输入一个正整数N,代表有根树的结点数 输出 输出这棵树期望的叶子节点数.要求误差小于1e-9 样例输入 1 样例输出 1.000000000 提示 1<=N<=10^9 设 ...
- BZOJ3834[Poi2014]Solar Panels——分块
题目描述 Having decided to invest in renewable energy, Byteasar started a solar panels factory. It appea ...
- css修改input表单默认样式重置与自定义大全
链接地址: 伪元素表单控件默认样式重置与自定义大全 http://www.zhangxinxu.com/wordpress/?p=3381 Chrome 现在不支持通过伪元素修改 meter 元素样式 ...
- Tunnel Warfare HDU - 1540(线段树最长连续区间)
题意: 一条线上的点,D x是破坏这个点,Q x是表示查询以x所在的最长的连续的点的个数,R是恢复上一次破坏的点. 解析: 线段树结点 设置一个 lq记录区间左端点开始的最大连续个数, rq ...
- 详解基于朴素贝叶斯的情感分析及 Python 实现
相对于「 基于词典的分析 」,「 基于机器学习 」的就不需要大量标注的词典,但是需要大量标记的数据,比如: 还是下面这句话,如果它的标签是: 服务质量 - 中 (共有三个级别,好.中.差) ╮(╯-╰ ...
- 11 Zabbix Item类型之Zabbix Calculated 计算型Item类型
点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 11 Zabbix Item类型之Zabbix Calculated 计算型Item类型 计算类型 ...
- WC 2019 记
“在下一次挑战来临时,还能否有足够的勇气和力量重新提起这被震掉两次的剑呢?” 难得来参加一次$WC$,这是第一次来,也很有可能是最后一次了(我也好希望有下一次啊,哪怕这可能再渺小,如同浩瀚星空中一丝辰 ...
- 本地Git与GitHub服务器建立连接(SSH方式通信)
简介 Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. github是一个基于git的代码托管平台,付费用户可以建私人仓库,我们一般的免费用户只能使用公共仓库,也就是代码要 ...
- Android原生(Native)C开发之四:SDL移植笔记
http://www.apkbus.com/forum.php?mod=viewthread&tid=1989 SDL(Simple DirectMedia Layer)是一套开放源码的跨平台 ...
- C++ 中的导致编译错误汇总
多少年来,各路英雄好汉,八方神犇大佬,在CE中饮恨退役. OI的CE,还是那样熟悉的味道. (博主只能想到这么多,欢迎大家来补充) 1.变量名和内置函数冲突?!?! C++内置函数很多很多,许多你不知 ...