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. 【Unity 3D 游戏开发】Unity3D 入门 - 工作区域介绍 与 入门演示样例

    一. 工作区域具体解释 1. Scence视图 (场景设计面板) scence视图简单介绍 : 展示创建的游戏对象, 能够对全部的游戏对象进行 移动, 操作 和 放置; -- 演示样例 : 创建一个球 ...

  2. 代码调试过程中easy遇到的问题

    前两天身体有些不舒服,也没写啥新文章,昨天下了一天的雨.今天阳光明媚,空气也非常新奇.心情大好. 继翻译为什么输出是String而不是Object,今天先写一下调试方面的东西.java中自带的函数调试 ...

  3. python基础小练习

    def main(): number = int(input("请输入学生的总人数:")) # 输入要录入的学生总数 count = number # 用一个变量来保存这个学生总数 ...

  4. notpad++快捷键

    Notpad++快捷键 Notepad++选中行操作 快捷键 使用技巧 作者: Rememberautumn 分类: 其他 发布时间: 2014-09-04 14:18 阅读: 60,106  微信小 ...

  5. C语言socket send()数据缓存问题

    send()函数默认情况下会使用Nagle算法.Nagle算法通过将未确认的数据存入缓冲区直到积攒到一定数量一起发送的方法.来降低主机发送零碎小数据包的数目.所以假设send()函数发送数据过快的话, ...

  6. group by where having 联合使用

    having子句与where有相似之处但也有区别,都是设定条件的语句.在查询过程中聚合语句(sum,min,max,avg,count)要比having子句优先执行.而where子句在查询过程中执行优 ...

  7. Android 的assets文件资源与raw文件资源读取

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/zpf8861/article/details/34504183   res/raw和assets的同 ...

  8. node-sass 安装失败win32-x64-48_binding.node

    升级了nodejs的版本,原项目的node-sass模块启动安装不了. 下载对应的win32-x64-xx_binding.node https://github.com/sass/node-sass ...

  9. Duplicate Observed Data

    在翻看<重构-改善既有代码的设计>这本经典的书,书中就介绍了一个重构方法--Duplicate Observed Data 复制被监视数据的重构方法,使用这种方法能够使界面和对数据的操作隔 ...

  10. extjs4.0 treepanel节点的选中、展开! 数据的重新加载

    1.extjs4.0API较3.0有非常大变化2.多级子父节点的选中和展开.3.数据的重新加载.tree.getStore().load4.节点的移除,从树中根据ID获取节点 tree.getStor ...