题目链接: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. 【转】CSG(Closed Subscriber Group)闭合用户组

    CSG是3GPP R8中引入的概念,定义为闭合用户组.有以下特点: 1. 每个CSG由一个CSG ID标识 2. 同一用户可属于多个CSG,用户与CSG的关系就好比签约,启用了CSG小区只会允许签约用 ...

  2. AngularJS:API

    ylbtech-AngularJS:API 1.返回顶部 1. AngularJS API API 意为 Application Programming Interface(应用程序编程接口). An ...

  3. eclipse中删除tomcat server 导致不能重新创建该server

    定位到:workspace\.metadata\.plugins\org.eclipse.core.runtime\.settings 1 打开org.eclipse.jst.server.tomca ...

  4. 用IntelliJ IDEA建maven项目,如何解决main下无法创建java源文件

    一.缺少java源文件 如下图: 现在想要在main下面增加java源文件,效果图如下所示: 首先,在main目录下新建java文件夹,就是源文件目录, 然后,右键,选择Mark Directory ...

  5. 发任务找不到test-unit报错

    发任务的时候因找不到gem包test-unit报错, 出错行: require 'test/unit' require 'test/unit/testresult' 解决办法如下 1.通过命令查看ge ...

  6. Tiny4412 Linux 内核配置流程

    1.配置交叉编译器 默认情况下,内核构建的是与宿主机相同的体系架构镜像.如果要交叉编译,需要设置两个变量ARCH和CORSS_COMPILE. ①ARCH:指明目标体系架构,如x86.arm.mips ...

  7. 1-EasyNetQ介绍(黄亮翻译)

    EasyNetQ 是一个容易使用,坚固的,针对RabbitMQ的 .NET API. 假如你尽可能快的想去安装和运行RabbitMQ,请去看入门指南. EasyNetQ是为了提供一个尽可能简洁的适用与 ...

  8. OSI七层网络模型与TCP/IP四层网络模型

    1.OSI网络7层模型 网络协议设计者不应当设计一个单一.巨大的协议来为所有形式的通信规定完整的细节,而应把通信问题划分成多个小问题,然后为每一个小问题设计一个单独的协议.这样做使得每个协议的设计.分 ...

  9. IE6中浮动双边距bug

    想要创建出漂亮的网页设计, 除了要认真学习每一个html和CSS代码之外,不可能不去了解一下臭名昭著的IE6和更早的那些IE浏览器的坏脾气,因为你本来写出的规规矩矩的代码, 漂亮的设计就此就要完成了, ...

  10. Android屏幕适配终结者

    1,http://blog.csdn.net/zhengjingle/article/details/51742839 github : https://github.com/zhengjingle/ ...