1 : 第一种 prime     首先确定一个点 作为已经确定的集合 , 然后以这个点为中心 , 向没有被收录的点 , 找最短距离( 到已经确定的点 ) , 找一个已知长度的最小长度的 边 加到 sum里面 然后收录这个点 ,

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<limits.h>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<stack>
#include<string>
#include<sstream>
#include<map>
#include<cctype>
using namespace std; // prim 针对点 进行 最小生成树的 构造
int a[][],visited[],tem[],dis,minn,n,m,sum;
int main() // 首先 以 1 为 根节点 , 开始向周围寻找 找到一个 最小的边
{ // 然后 将 该边的 另一个端点标记为 已访问 然后 将该边 的长度 加到sum 中
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
sum=;
for(int i=;i<=n;i++)
{
tem[i]=INT_MAX; // 除了已经确定 了的楼 , 剩余的楼 到 集合中确定的 距离都是最大
for(int j=;j<=n;j++)
a[i][j]=INT_MAX; // 每两个楼之间的距离超大
}
memset(visited,,sizeof(visited));
while(m--)
{
int b,c,d;
scanf("%d%d%d",&b,&c,&d);
a[b][c]=a[c][b]=d;
}
int n1=n-,b=;
b=; // 楼的编号 从1 开始
visited[]=; // 1号楼 已经确定
while(n1--) // 只需要确定 n-1 条边
{
minn=INT_MAX;
for(int i=;i<=n;i++)
{
if(b!=i&&a[b][i]<tem[i]&&!visited[i])// 不是自己到自己
{
tem[i]=a[b][i];
}
}
int j;
for(int i=;i<=n;i++)
{
if(minn>tem[i]&&!visited[i])
{
minn=tem[i];
j=i; // 找到和 已知集合相连的 最小的一条边
}
}
visited[j]=;
b=j;
sum+=minn;
}
minn=INT_MAX;
for(int i=;i<n;i++)
{
scanf("%d",&b);
minn=minn<b?minn:b; // 找到 拉电源 最小花费的 楼 所花费的金额 .
}
printf("%d\n",minn+sum);
}
return ;
}

2 : kruskal     用一个结构体储存信息 , 然后 根据边长来 排序 , 然后一条一条边的收录 如果 形成了环  就不收录这一条边 .

 #include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<limits.h>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<stack>
#include<string>
#include<sstream>
#include<map>
#include<cctype>
using namespace std;
int father[],sum;
struct node
{
int x,y,l;
};
bool cmp(node a,node b)
{
return a.l<b.l;
}
int find(int x) // 做了时间上的优化 ,但是 在空间复杂度上比较高
{
if(x!=father[x])
father[x]=find(father[x]);
sum++;
return father[x];
}
bool merge(int x,int y) // 做了时间复杂度上的优化 让并查集的 深度尽量 浅
{
int sum1,sum2;
sum=;
x=find(x);
sum1=sum; // x 的深度
sum=;
y=find(y);
sum2=sum; // y 的深度
if(x!=y)
{
if(sum1>sum2)
father[y]=x;
else
father[x]=y;
return true;
}
else
return false;
}
node a[];
int main()
{
int t,n,m;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
sum=;
for(int i=;i<m;i++)
{
int b,c,d;
scanf("%d%d%d",&b,&c,&d);
a[i].x=b;
a[i].y=c;
a[i].l=d;
}
sort(a,a+m,cmp);
int count1=;
for(int i=;i<=;i++)
father[i]=i;
int sum1=;
for(int i=;i<m;i++) // 开始 做了他
{
if(merge(a[i].x,a[i].y)) // 返回 flase 的话 就代表成环了
{
count1++;
sum1+=a[i].l;
if(count1==n-) // 如果已经形成 树的话
break;
}
}
int minn=INT_MAX;
for(int i=;i<n;i++)
{
int b;
scanf("%d",&b);
minn=b<minn?b:minn;
}
printf("%d\n",minn+sum1);
}
return ;
}

布线问题 最小生成树 prim + kruskal的更多相关文章

  1. 最小生成树 Prim Kruskal

    layout: post title: 最小生成树 Prim Kruskal date: 2017-04-29 tag: 数据结构和算法 --- 目录 TOC {:toc} 最小生成树Minimum ...

  2. 邻接矩阵c源码(构造邻接矩阵,深度优先遍历,广度优先遍历,最小生成树prim,kruskal算法)

    matrix.c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include < ...

  3. 数据结构学习笔记05图(最小生成树 Prim Kruskal)

    最小生成树Minimum Spanning Tree 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边. 树: 无回路   |V|个顶 ...

  4. NYOJ 38 布线问题 (最小生成树 prim)

    题目链接 描述 南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件: 1.把所有的楼都供上电. 2.所用电线花费最少 输入 第一行是一个整数n表示有n组测 ...

  5. POJ 1258 Agri-Net(最小生成树 Prim+Kruskal)

    题目链接: 传送门 Agri-Net Time Limit: 1000MS     Memory Limit: 10000K Description Farmer John has been elec ...

  6. 最小生成树-Prim&Kruskal

    Prim算法 算法步骤 S:当前已经在联通块中的所有点的集合 1. dist[i] = inf 2. for n 次 t<-S外离S最近的点 利用t更新S外点到S的距离 st[t] = true ...

  7. 邻接表c源码(构造邻接矩阵,深度优先遍历,广度优先遍历,最小生成树prim,kruskal算法)

    graph.c #include <stdio.h> #include <stdlib.h> #include <limits.h> #include " ...

  8. p1221网络布线(最小生成树 Prim(普里母)算法) p1222 Watering Hole

    描述 Description 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当然,他需要你的帮助.约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路 ...

  9. poj1861 最小生成树 prim &amp; kruskal

    // poj1861 最小生成树 prim & kruskal // // 一个水题,为的仅仅是回味一下模板.日后好有个照顾不是 #include <cstdio> #includ ...

随机推荐

  1. C++模板实现的AVL树

    1 AVL树的定义 AVL树是一种自平衡二叉排序树.它的特点是不论什么一个节点的左子树高度和右子树的高度差在-1,0,1三者之间. AVL树的不论什么一个子树都是AVL树. 2 AVL树的实现 AVL ...

  2. 在OpenStack中绕过或停用security group (iptables)

    眼下.OpenStack中默认採用了security group的方式.用系统的iptables来过滤进入vm的流量.这个本意是为了安全,可是往往给调试和开发带来一些困扰. 因此,暂时性的禁用它能够排 ...

  3. 李洪强iOS开发之 - enum与typedef enum的用法

    李洪强iOS开发之 - enum与typedef enum的用法 01 - 定义枚举类型 上面我们就在ViewController.h定义了一个枚举类型,枚举类型的值默认是连续的自然数,例如例子中的T ...

  4. block-循环引用

    在ARC机制下,app的内存管理由操作系统进行管理,不须要程序猿手动的管理内存,方便了开发.虽然,自己主动释放内存非常方便.可是并不是绝对安全,绝对不会产生内存泄露. 大部分导致iOS对象无法按预期释 ...

  5. SpringMVC -- 第一个简单的程序

    学习springMVC,我们来记录下第一个HelloWord的程序 首先.我们组织须要的jar包 commons-logging-1.1.3.jar spring-aop-4.1.7.RELEASE. ...

  6. SKStoreReviewController之程序内评价

    在iOS 10.3出现之前,App实现评价方式一般有两种: (一)deep link调用.在app 链接地址后面拼上action=write-review这种方式可以实现程序内评价: (二)App跳转 ...

  7. 解决gradle多模块依赖在Idea中能运行,gradle build失败的问题。

    最近需要初始化一个SpringBoot新项目遇到一个问题就是:项目中有多个子模块,使用gradle依赖管理成功. 项目结构如下: project --module1     --module2我的mo ...

  8. gRPC错误码 http状态码 provide your APIs in both gRPC and RESTful style at the same time

    How gRPC error codes map to HTTP status codes in the response https://github.com/grpc-ecosystem/grpc ...

  9. Hadoop_stack_cmd

    HDFS命令基本格式:Hadoop fs -cmd < args > HDFS命令基本格式:Hadoop fs -cmd < args > ls 命令 hadoop fs -l ...

  10. Delphi语言最好的JSON代码库 mORMot学习笔记1(无数评论)

    mORMot没有控件安装,直接添加到lib路径,工程中直接添加syncommons,syndb等到uses里 --------------------------------------------- ...