题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1162

意义:给出一些点,用线问使所有点直接或间接连通,需要多长;

思路:裸最小生成树;

法1:

prim算法:MST(Minimum Spanning Tree,最小生成树)问题有两种通用的解法,Prim算法就是其中之一,它是从点的方面考虑构建一颗MST,大致思想是:设图G顶点集合为U,首先任意选择图G中的一点作为起始点a,将该点加入集合V,再从集合U-V中找到另一点b使得点b到V中任意一点的权值最小,此时将b点也加入集合V;以此类推,现在的集合V={a,b},再从集合U-V中找到另一点c使得点c到V中任意一点的权值最小,此时将c点加入集合V,直至所有顶点全部被加入V,此时就构建出了一颗MST。因为有N个顶点,所以该MST就有N-1条边,每一次向集合V中加入一个点,就意味着找到一条MST的边。(这短话复制的别人的,感觉写的蛮好的)

prim算法就是从待选点集中依次选出距离已选点集中距离最小的点加入已选点集中;

代码:

 #include <iostream>
#include <math.h>
#include <algorithm>
#include <string.h>
#include <stdio.h>
#define MAXN 100+10
#define INF 9999999999
using namespace std; int n, tag[MAXN];
double mp[MAXN][MAXN], low[MAXN]; double prime(void){
memset(tag, , sizeof(tag)); //×××标记数组清 0
int s=;
double cnt=;
for(int i=; i<=n; i++){ //×××从点 1 开始
low[i]=mp[s][i];
}
for(int i=; i<=n; i++){
double min=INF;
for(int j=; j<=n; j++){ //×××找到未添加点中到以添加点中距离最近的点即当前要添加的点
if(!tag[j]&&min>low[j]){
min=low[j];
s=j;
}
}
cnt+=min; //***本题中不存在不能连同的情况,所以不需要加 if(min>=INF) return -1
tag[s]=;
for(int j=; j<=n; j++){
if(!tag[j]&&low[j]>mp[s][j]){ //×××更新low数组
low[j]=mp[s][j];
}
}
}
return cnt;
} int main(void){
while(~scanf("%d", &n)){
pair<double, double> p[MAXN];
for(int i=; i<=n; i++){
scanf("%lf%lf", &p[i].first, &p[i].second);
}
for(int i=; i<=n; i++){
for(int j=; j<=n; j++){
mp[i][j]=sqrt((p[j].first-p[i].first)*(p[j].first-p[i].first)+(p[j].second-p[i].second)*(p[j].second-p[i].second));
}
}
double ans=prime();
printf("%.2lf\n", ans);
}
return ;
}

法2:

kruscal算法:

将图中边按其权值由小到大的次序顺序选取,若选边后不形成回路,则保留作为一条边,若形成回路则除去.依次选够(n-1)条边,即得最小生成树.(n为顶点数)

代码:

 #include <iostream>
#include <algorithm>
#include <stdio.h>
#include <math.h>
#define MAXN 10000+10
using namespace std; struct node{
int x, y;
double weight;
}map[MAXN]; int m, n, pre[MAXN]; bool cmp(node a, node b){
return a.weight < b.weight;
} int find(int x){
while(pre[x]!=x){
x=pre[x];
}
return x;
} double join(node a){
int px=find(a.x);
int py=find(a.y);
if(px!=py){
pre[px]=py;
return a.weight;
}else{
return ; //××××若成环则返回 0
}
} double kruskal(void){
for(int i=; i<=n; i++){
pre[i]=i;
}
double cnt=;
sort(map, map+m, cmp);
for(int i=; i<m; i++){
cnt+=join(map[i]);
}
return cnt;
} int main(void){
while(~scanf("%d", &n)){
pair<double, double> p[MAXN];
for(int i=; i<=n; i++){
scanf("%lf%lf", &p[i].first, &p[i].second);
}
int k=;
for(int i=; i<=n; i++){
for(int j=i+; j<=n; j++){
double cnt=sqrt((p[i].first-p[j].first)*(p[i].first-p[j].first)+(p[i].second-p[j].second)*(p[i].second-p[j].second));
map[k].x=i;
map[k].y=j;
map[k].weight=cnt;
k++;
}
}
m=k;
double ans=kruskal();
printf("%.2lf\n", ans);
}
return ;
}

hdu1162(最小生成树 prim or kruscal模板)的更多相关文章

  1. hdu1162(最小生成树 prim or kruscal)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1162 意义:给出一些点,用线问使所有点直接或间接连通,需要多长: 思路:裸最小生成树: 法1: pri ...

  2. 最小生成树--prim+优先队列优化模板

    prim+优先队列模板: #include<stdio.h> //大概要这些头文件 #include<string.h> #include<queue> #incl ...

  3. 最小生成树prim和kruskal模板

    prim: int cost[MAX_V][MAX_V]; //cost[u][v]表示边e=(u,v)的权值(不存在的情况下设为INF) int mincost[MAX_V]; //从集合X出发的每 ...

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

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

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

    Agri-Net Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 39820   Accepted: 16192 Descri ...

  6. 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。

    //归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...

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

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

  8. 最小生成树Prim算法(邻接矩阵和邻接表)

    最小生成树,普利姆算法. 简述算法: 先初始化一棵只有一个顶点的树,以这一顶点开始,找到它的最小权值,将这条边上的令一个顶点添加到树中 再从这棵树中的所有顶点中找到一个最小权值(而且权值的另一顶点不属 ...

  9. 转载:最小生成树-Prim算法和Kruskal算法

    本文摘自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/30/2615542.html 最小生成树-Prim算法和Kruskal算法 Prim算 ...

随机推荐

  1. Spark on yarn的两种模式 yarn-cluster 和 yarn-client

    从深层次的含义讲,yarn-cluster和yarn-client模式的区别其实就是Application Master进程的区别,yarn-cluster模式下,driver运行在AM(Applic ...

  2. [转] LINUX 三种网络连接模式

     Linux下NAT模式和桥接模式的网络配置 最近在配置linux虚拟机的时候发现有很多坑,现在记录下来以防日后又跳到坑里. 我的运行环境是:主机 windows 7  虚拟机 Virtualbox ...

  3. idea debug的时候 启动起来超级慢

  4. vue实用难点讲解

    此篇文章是我基于研究vue文档三遍的基础上,觉得还有点难理解或者难记的知识点总结 列表渲染 1.渲染组件必须加key,并且属性是手动传递给组件的 <my-component v-for=&quo ...

  5. virtualbox下安装的纯净版centOS7,无法访问外网

    virtualbox下安装的纯净版centOS7,网络设置如下: 需要在/etc/sysconfig/network-scripts/下编辑ifcfg-enp0s3,其中,NOBOOT设置成也是,就可 ...

  6. javascript——对象的概念——函数 1 (函数对象的属性和方法)

    一.创建函数 函数是一种对象:Function类 是对象,可以通过 Function 实例化一个函数,不过最多的还是利用 function 来创建函数. 方式一:利用 Function类 来实例化函数 ...

  7. javascipt——对象的概念——数组

    一.Array 特点: 数组的长度是可变的: 数组的索引可以是数字.字符串: 数组的内容可以是任意内容: 可以通过索引获取之前不存在的一个位置,其值为undefined: 1.构造函数: new Ar ...

  8. maven 本地jar包依赖生成

    转载自:http://www.cnblogs.com/wuyouwulv/p/maven_configure_oracle_jdbc.html 由于Oracle授权问题,Maven不提供Oracle ...

  9. ActiveMQ (三) Spring整合JMS入门

    Spring整合JMS入门 前提:安装好了ActiveMQ  ActiveMQ安装 Demo结构:   生产者项目springjms_producer: pom.xml <?xml versio ...

  10. ZROI2018提高day5t1

    传送门 分析 我们不难将条件转换为前缀和的形式,即 pre[i]>=pre[i-1]*2,pre[i]>0,pre[k]=n. 所以我们用dp[i][j]表示考虑到第i个数且pre[i]= ...