最小生成树之Prim Kruskal算法(转)
最小生成树
Prim算法:
- //Prim
- struct edge{
- int to,len,next;
- }e[maxm];
- int box[maxn],cnt,used[maxn];
- void init(int n){
- for(int i=0;i<=n;i++)box[i]=-1;
- cnt=0;
- }
- void add(int from,int to,int len){
- e[cnt].to=to;
- e[cnt].len=len;
- e[cnt].next=box[from];
- box[from]=cnt++;
- }
- struct node{
- int v,len;
- node(){}
- node(int x,int y):v(x),len(y){}
- bool operator<(const node &x)const{
- return len>x.len;
- }
- };
- priority_queue<node> pq;
- int Prim(int n,int m){
- memset(used,0,sizeof(used));//初始化所有点,设状态为unseen
- int num=0,sum=0,now=1;
- do{
- used[now]=1;
- for(int t=box[now];t+1;t=e[t].next){
- int v=e[t].to,len=e[t].len;
- if(!used[v])pq.push(node(v,len));
- }
- while(!pq.empty()){
- node tmp=pq.top();pq.pop();
- int v=tmp.v,len=tmp.len;
- if(used[v])continue;
- now=v;
- sum+=len;
- break;
- }
- num++;
- }while(num<n);
- return sum;
- }
//Prim
struct edge{
int to,len,next;
}e[maxm];
int box[maxn],cnt,used[maxn];
void init(int n){
for(int i=0;i<=n;i++)box[i]=-1;
cnt=0;
}
void add(int from,int to,int len){
e[cnt].to=to;
e[cnt].len=len;
e[cnt].next=box[from];
box[from]=cnt++;
}
struct node{
int v,len;
node(){}
node(int x,int y):v(x),len(y){}
bool operator<(const node &x)const{
return len>x.len;
}
};
priority_queue<node> pq;
int Prim(int n,int m){
memset(used,0,sizeof(used));//初始化所有点,设状态为unseen
int num=0,sum=0,now=1;
do{
used[now]=1;
for(int t=box[now];t+1;t=e[t].next){
int v=e[t].to,len=e[t].len;
if(!used[v])pq.push(node(v,len));
}
while(!pq.empty()){
node tmp=pq.top();pq.pop();
int v=tmp.v,len=tmp.len;
if(used[v])continue;
now=v;
sum+=len;
break;
}
num++;
}while(num<n);
return sum;
}
Kruskal算法:
- #define maxn 110
- #define maxm 10010
- using namespace std;
- int uf[maxn];
- struct edge{
- int u,v,len;
- }e[maxm];
- bool cmp(const edge &x,const edge &y){
- return x.len<y.len;
- }
- void init(int n){//初始化并查集
- for(int i=0;i<=n;i++)uf[i]=i;
- }
- int find(int x){
- if(x==uf[x])return x;
- return uf[x]=find(uf[x]);
- }
- int Union(int x,int y){//合并两个集合(如果x,y在同一集合,返回0,否则返回1)
- x=find(x),y=find(y);
- if(x!=y){
- uf[x]=y;
- return 1;
- }
- return 0;
- }
- int Kruskal(int n,int m){//n个点,m条边
- sort(e,e+m,cmp);//排序
- int sum=0;//最小生成树的权值和
- for(int i=0;i<m;i++){//从小到大枚举边
- int u=e[i].u,v=e[i].v,len=e[i].len;
- sum+=len*Union(u,v);
- }
- return sum;//返回权值和
- }
#define maxn 110
#define maxm 10010
using namespace std;
int uf[maxn];
struct edge{
int u,v,len;
}e[maxm];
bool cmp(const edge &x,const edge &y){
return x.len<y.len;
}
void init(int n){//初始化并查集
for(int i=0;i<=n;i++)uf[i]=i;
}
int find(int x){
if(x==uf[x])return x;
return uf[x]=find(uf[x]);
}
int Union(int x,int y){//合并两个集合(如果x,y在同一集合,返回0,否则返回1)
x=find(x),y=find(y);
if(x!=y){
uf[x]=y;
return 1;
}
return 0;
}
int Kruskal(int n,int m){//n个点,m条边
sort(e,e+m,cmp);//排序
int sum=0;//最小生成树的权值和
for(int i=0;i<m;i++){//从小到大枚举边
int u=e[i].u,v=e[i].v,len=e[i].len;
sum+=len*Union(u,v);
}
return sum;//返回权值和
}
最小生成树之Prim Kruskal算法(转)的更多相关文章
- 最小生成树(prim&kruskal)
最近都是图,为了防止几次记不住,先把自己理解的写下来,有问题继续改.先把算法过程记下来: prime算法: 原始的加权连通图——————D被选作起点,选与之相连的权值 ...
- 邻接矩阵c源码(构造邻接矩阵,深度优先遍历,广度优先遍历,最小生成树prim,kruskal算法)
matrix.c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include < ...
- 最小生成树(II)与Kruskal算法
为防止网页加载过慢,故分两章.上接https://www.cnblogs.com/Uninstalllingyi/p/10479470.html Kruskal算法——将森林合并成树 玩过瘟疫公司吗… ...
- 邻接表c源码(构造邻接矩阵,深度优先遍历,广度优先遍历,最小生成树prim,kruskal算法)
graph.c #include <stdio.h> #include <stdlib.h> #include <limits.h> #include " ...
- 最小生成树求法 Prim + Kruskal
prim算法的思路 和dijkstra是一样的 每次选取一个最近的点 然后去向新的节点扩张 注意这里的扩张 不再是 以前求最短路时候的到新的节点的最短距离 而是因为要生成一棵树 所以是要连一根最短的连 ...
- 洛谷P3366【模板】最小生成树-克鲁斯卡尔Kruskal算法详解附赠习题
链接 题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz 输入输出格式 输入格式: 第一行包含两个整数N.M,表示该图共有N个结点和M条无向边.(N<=5000,M&l ...
- 数据结构之 图论---最小生成树(prim + kruskal)
图结构练习——最小生成树 Time Limit: 1000MS Memory limit: 65536K 题目描述 有n个城市,其中有些城市之间可以修建公路,修建不同的公路费用是不同的.现在我们想知 ...
- 图解最小生成树 - 克鲁斯卡尔(Kruskal)算法
我们在前面讲过的<克里姆算法>是以某个顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树的.同样的思路,我们也可以直接就以边为目标去构建,因为权值为边上,直接找最小权值的边来构建生成树 ...
- 最小生成树——Prim算法和Kruskal算法
洛谷P3366 最小生成树板子题 这篇博客介绍两个算法:Prim算法和Kruskal算法,两个算法各有优劣 一般来说当图比较稀疏的时候,Kruskal算法比较快 而当图很密集,Prim算法就大显身手了 ...
随机推荐
- 关于开发APP接口版本不兼容的问题
关于 APP接口版本兼容的问题. iOS和android 要不断开发新版本,很多服务端开发都是在以前接口的逻辑上进行修改. 新的APP和接口开发后,接口如何兼容老的APP? 有的公司 每次发布完APP ...
- mongodb远程链接命令
mongo 172.17.0.170:27017/spider_data -u admin -p 然后输入密码 切换数据库 use spider_data 查看所有表 show tables
- 原来项目更换svn地址
近期公司由于旧地址装修,临时更换办公地址:同时相应的网络地址也更换了.我们开发项目的svn地址根目录也得改变.所以怎么解决呢? 1.找到项目根文件夹: 右键:
- SUSE系列---修改IP和hosts文件
有些时候我们需要修改linux系统的IP,此时我们要注意,修改IP之后,如果我们如果不修改hosts文件,那么可能我们一些服务会无法使用:下面分别记录修改IP和hosts文件的方法: 修改IP: 打开 ...
- 多线程分配线程的实现方案:CountDownLatch类
需求:假如我们本地有4个文件需要解析,每个文件的内容为20万行.为了提高效率我们要创建4个线程进行处理.等4个线程处理完,要在文件日志表中记录处理状态. 一般的的解决方法是使用join,join用于让 ...
- pandas基础,Serires,Dataframe
DataFrame DataFrame是Pandas中的一个表格型的数据结构,包含有一组有序的列,每列可以是不同的值类型(数值.字符串.布尔型等),DataFrame即有行索引也有列索引,可以被看做是 ...
- tensorflow分布式运行
1.知识点 """ 单机多卡:一台服务器上多台设备(GPU) 参数服务器:更新参数,保存参数 工作服务器:主要功能是去计算 更新参数的模式: 1.同步模型更新 2.异步模 ...
- shell中变量计算
year=44 1.let,不需要$引用变量 let m=year+3 echo $m 2.(()) m=$((year+3)) 3.[ ],注意两边一定要有空格 m=$[ year+3 ] 4. ...
- 五十二:WTForms表单验证之基本使用
作用:1.做表单验证,把用户提交的数据验证是否合法2.做模板渲染 安装:pip install wtforms 表单验证1.自定义一个表单类,继承wtforms.Form2.定义好需要验证的字段,字段 ...
- SQL学习(八)日期处理
不同数据库中,针对日期处理的函数不同 Oracle中常用日期函数 (1.sysdate: 获取当前系统时间 如: select sysdate() ----返回当前时间,包括年月日 时分秒 (2.to ...