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 ...
随机推荐
- BZOJ3522[Poi2014]Hotel——树形DP
题目描述 有一个树形结构的宾馆,n个房间,n-1条无向边,每条边的长度相同,任意两个房间可以相互到达.吉丽要给他的三个妹子各开(一个)房(间).三个妹子住的房间要互不相同(否则要打起来了),为了让吉丽 ...
- java访问权限表
private(私有的) 默认的(什么都不写) protected(受保护的) public(公共的 ) 同一个类中 yes yes yes yes 同一个包中不同类之间 no yes yes ...
- 【BZOJ4671】异或图(斯特林反演)
[BZOJ4671]异或图(斯特林反演) 题面 BZOJ Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出 ...
- 洛谷P3515 [POI2011]Lightning Conductor(动态规划,决策单调性,单调队列)
洛谷题目传送门 疯狂%%%几个月前就秒了此题的Tyher巨佬 借着这题总结一下决策单调性优化DP吧.蒟蒻觉得用数形结合的思想能够轻松地理解它. 首先,题目要我们求所有的\(p_i\),那么把式子变一下 ...
- 03 Zabbix4.0添加cisco交换机基本监控步骤
点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 03 Zabbix4.0添加cisco交换机基本监控步骤 主题监控一台cisco网络设备的6项内容 ...
- 自学Zabbix11.5 Zabbix SNMP监控实例
点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix11.5 Zabbix SNMP监控实例-监控网络设备内存使用情况 1. zabb ...
- 【BZOJ2281】[SDOI2011]黑白棋(博弈论,动态规划)
[BZOJ2281][SDOI2011]黑白棋(博弈论,动态规划) 题面 BZOJ 洛谷 题解 先看懂这题目在干什么. 首先BZOJ上面的题面没有图,换到洛谷看题就有图了. 不难发现都相邻的两个异色棋 ...
- Django + Uwsgi +Nginx生产环境部署
python manage.py runserver 0.0.0.0:80 ,一定不要用这个轻量级Server作为你的生产环境下的Server,因为它只能用于开发自测阶段.它既没有安全审计功能,而且又 ...
- Mongodb中经常出现的错误(汇总)child process failed, exited with error number
异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 异常处理汇总-数据库系列 http://www.cnblogs.com/dun ...
- Android编程心得-在Assets文件夹中放入.sql文件实现创建SQlite表的操作
当我们在使用SQLiteOpenHelper时,经常使用db.execSQL(String sql)方法写入对应语句实现创建表的操作,这样的确可以实现业务逻辑.与此同时还有一种更灵活的方法,从asse ...