模板——最小生成树prim算法&&向前星理解
通过最小生成树(prim)和最短路径优化引出的向前星存图,时至今日才彻底明白了。。
head[i]存储的是父节点为i引出的最后一条边的编号,
next负责把head[i]也就是i作为父节点的所有边连接起来,next也是存的编号,
在所存的edge结构体中,只有w是保存边的值,而u是保存的子节点。
这样设置的话,由head[i]就可以引出所有与i相关的边和点,
显而易见,这样的存放方法空间+时间复杂度双优化,比邻接矩阵是优化多了。。
然后就是prim算法,
最小生成树的一种算法,适用于稠密图,因为是以点更新的,正好与之前的克鲁斯卡尔算法互补了,
不过代码比k长,思路也难一些,大致和迪杰差不多,也用了dis数组,目测也就是更新dis值的时候不同(其实很不同,就形式差不多而已),
下面附上代码,借鉴某位luogu大神的题解,真的很简洁明了了,在luogu上比 k 快了大概一倍240+ms。
其他优化用了快读+re。
#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include <queue>
#define maxn 5002
#define maxm 200001
#define inf 9999
#define re register using namespace std; int n,m,cnt,sum=,k=;
int a,b,c;
int dis[maxn],head[maxn],vis[maxn]; typedef pair <int,int> pii;
priority_queue <pii,vector<pii>,greater<pii> > q; struct Edge
{
int w,next,v;//w权值,v子节点
}edge[maxm*];
inline int read()
{
char ch;
int a=;
while(!(((ch=getchar())>='')&&(ch<='')));
a*=;a+=ch-'';
while(((ch=getchar())>='')&&(ch<=''))a*=,a+=ch-'';
return a;
}
void add(int u,int v,int w)
{
edge[++cnt].v=v;
edge[cnt].w=w;
edge[cnt].next =head[u];
head[u]=cnt;
} void prim()
{
dis[]=;
q.push(make_pair(,));
while(!q.empty()&&k<n)
{
int d=q.top().first,u=q.top().second;//first 最小值,second 位置
q.pop();
if(vis[u])continue;
k++;
sum+=d;
vis[u]=;
for(re int i=head[u];i!=-;i=edge[i].next )
{
if((edge[i].w<dis[edge[i].v]))
{
dis[edge[i].v]=edge[i].w;
q.push(make_pair(dis[edge[i].v],edge[i].v)) ;
}
}
}
} int main()
{
memset(head,-,sizeof(head));
memset(dis,inf,sizeof(dis));
n=read();
m=read();
for(re int i=;i<=m;i++)
{
a=read();b=read();c=read();
add(a,b,c);
add(b,a,c);
}
prim();
if(k==n)printf("%d",sum);
else cout<<"orz";
return ;
}
模板——最小生成树prim算法&&向前星理解的更多相关文章
- 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。
//归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...
- 图论算法(五)最小生成树Prim算法
最小生成树\(Prim\)算法 我们通常求最小生成树有两种常见的算法--\(Prim\)和\(Kruskal\)算法,今天先总结最小生成树概念和比较简单的\(Prim\)算法 Part 1:最小生成树 ...
- 最小生成树,Prim算法与Kruskal算法,408方向,思路与实现分析
最小生成树,Prim算法与Kruskal算法,408方向,思路与实现分析 最小生成树,老生常谈了,生活中也总会有各种各样的问题,在这里,我来带你一起分析一下这个算法的思路与实现的方式吧~~ 在考研中呢 ...
- 最小生成树Prim算法(邻接矩阵和邻接表)
最小生成树,普利姆算法. 简述算法: 先初始化一棵只有一个顶点的树,以这一顶点开始,找到它的最小权值,将这条边上的令一个顶点添加到树中 再从这棵树中的所有顶点中找到一个最小权值(而且权值的另一顶点不属 ...
- 最小生成树—prim算法
最小生成树prim算法实现 所谓生成树,就是n个点之间连成n-1条边的图形.而最小生成树,就是权值(两点间直线的值)之和的最小值. 首先,要用二维数组记录点和权值.如上图所示无向图: int map[ ...
- Highways POJ-1751 最小生成树 Prim算法
Highways POJ-1751 最小生成树 Prim算法 题意 有一个N个城市M条路的无向图,给你N个城市的坐标,然后现在该无向图已经有M条边了,问你还需要添加总长为多少的边能使得该无向图连通.输 ...
- MST(最小生成树)——Prim算法——HDU 1879-继续畅通工程
Prim算法很好理解,特别是学完了迪杰斯特拉算法之后,更加能理解Prim的算法思想 和迪杰斯特拉算法差不多,由于最后要形成连通图,故任意指定一个点,作为初始点,遍历所有点,以当前最小权值的点(和迪杰斯 ...
- SWUST OJ 1075 求最小生成树(Prim算法)
求最小生成树(Prim算法) 我对提示代码做了简要分析,提示代码大致写了以下几个内容 给了几个基础的工具,邻接表记录图的一个的结构体,记录Prim算法中最近的边的结构体,记录目标边的结构体(始末点,值 ...
- 图的最小生成树prim算法模板
用prim算法构建最小生成树适合顶点数据较少而边较多的图(稠密图) prim算法生成连通图的最小生成树模板伪代码: G为图,一般为全局变量,数组d为顶点与集合s的最短距离 Prim(G, d[]){ ...
随机推荐
- QML Delegate中访问该持有者的方式 附加属性(转载)
http://blog.csdn.net/yuxiaohen/article/details/17226971 用法很奇葩记录一下,实测可以,用于弱化delegate与持有者的依赖 delegat ...
- react-native-echarts
react-native-echarts是react native结合百度echart的图表,集成的一个图表插件. github地址:https://github.com/zhangxinagjunH ...
- mongodb使用mongos链接复制集
我们知道mongodb现在生产环境大部分还是使用的复制集来作为主流,据我了解.很多公司现在都是使用复制集的方式,而我们通过mongos可以巧妙的解决链接的问题,我们先从环境说起: 首先我们要模仿搭建的 ...
- java word转pdf 工具类
package com.elitel.hljhr.comm.web.main.controller; import java.io.File; import java.io.FileOutputStr ...
- February 5 2017 Week 6 Sunday
Prosperity discovers vice, adversity virtue. 得意时露瑕疵,逆境中见品质. Adversity will discover your virtue, not ...
- 马云18年前制止偷井盖视频走红 2013-05-10 11:00:37 来源: 新快报(广州) 有0人参与 分享到 网易微博 新浪微博 腾讯空间 人人网 有道云笔记 在一次访谈中,即将卸任阿里巴巴CEO的马云自曝了他第一次上电视是在1995年。“我刚开始创
马云18年前制止偷井盖视频走红 2013-05-10 11:00:37 来源: 新快报(广州) 有0人参与 分享到 网易微博 新浪微博 腾讯空间 人人网 有道云笔记 在一次访谈中,即将卸任阿里巴巴 ...
- Java Web技术经验总结
接口的权限认证,使用拦截器(HandlerInterceptorAdapter),参考:第五章 处理器拦截器详解——跟着开涛学SpringMVC.注意:推荐能使用servlet规范中的过滤器Filte ...
- 一个U盘黑掉你:TEENSY实战
从传统意义讲,当你在电脑中插入一张CD/DVD光盘,或者插入一个USB设备时,可以通过自动播放来运行一个包含恶意的文件,不过自动播放功能被关闭时,autorun.inf文件就无法自动执行你的文件了.然 ...
- The Tao to Excellent
1:一次只做一件事情 我不具备同时做好多件事情的能力. 2:随身携带一本书 效率最高的学习时间是那些零碎的时间. 3:听身体的 休息的标准是:如果你觉得你是在休息,那你就是在休息了. 4:如果有一件事 ...
- AngularJs学习笔记--Understanding Angular Templates
原版地址:http://docs.angularjs.org/guide/dev_guide.mvc.understanding_model angular template是一个声明规范,与mode ...