方法一:Prim
#include<iostream>
#include<algorithm>
#include<cstring>
#include<iomanip>
#include<cmath>
using namespace std;
const int maxx=505;
const double inf=0x3f3f3f3f;
double e[maxx][maxx];
int n;
int vis[maxx];
double dist[maxx];
int p[maxx];
double mincost;
struct node{double x,y;
}num[maxx];
double Dist(int i,int j){//用来计算任意两点之间的距离double x=num[i].x-num[j].x;double y=num[i].y-num[j].y;return sqrt(x*x+y*y);
}
void Prim(int u){for(int i=1;i<=n;i++){dist[i]=e[u][i];p[i]=u;}vis[u]=1;dist[1]=0;for(int i=1;i<=n;i++){double temp=inf;int t=u;for(int j=1;j<=n;j++){if(!vis[j]&&dist[j]<temp){temp=dist[j];t=j;}} if(t==u)break;vis[t]=1;mincost+=dist[t];for(int j=1;j<=n;j++){if(!vis[j]&&dist[j]>e[t][j]){dist[j]=e[t][j];p[j]=t;}}}
}
int main(){int t;while(cin>>n){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(i==j){e[i][j]=0;}else{e[i][j]=inf;}}}memset(vis,0,sizeof(vis));memset(p,0,sizeof(p));memset(dist,inf,sizeof(dist));for(int i=1;i<=n;i++){double x,y;cin>>num[i].x>>num[i].y;}for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){e[i][j]=e[j][i]=Dist(i,j);}}mincost=0;Prim(1);cout<<setiosflags(ios::fixed)<<setprecision(2)<<mincost<<endl;}return 0;
}
方法二:Kruskal-超时
#include<iostream>
#include<algorithm>
#include<cstring>
#include<iomanip>
#include<cmath>
using namespace std;
const int maxx=505;
const double inf=0x3f3f3f3f;
double e[maxx][maxx];
int n;
int vis[maxx];
double dist[maxx];
int p[maxx];
int pre[maxx];
int ranks[maxx];
struct node{int x,y;double w;
}t[maxx];
struct point{double x,y;
}num[maxx];
int cmp(node a,node b){return a.w<b.w;
}
double Dist(int i,int j){double x=num[i].x-num[j].x;double y=num[i].y-num[j].y;return sqrt(x*x+y*y);
}
void init(){for(int i=0;i<=maxx;i++){pre[i]=i;ranks[i]=0;}
}
/*递归
int find(int x){int r=x;if(pre[x]==r){return x;}return pre[x]=find(pre[x]);
}*/
int find(int x){int r=x;if(r!=pre[x]){r=pre[x];}int i=x,j;while(i!=r){j=pre[i];pre[i]=r;i=j;}return r;
}
void unio(int x,int y){int fx=find(x);int fy=find(y);if(ranks[fx]>ranks[fy]){pre[fy]=fx;}else{pre[fx]=fy;if(ranks[fx]==ranks[fy]){ranks[fx]++;}}
}
double Kruskal(int m){double mincost=0;int cnt=0;for(int i=1;i<=m;i++){if(find(t[i].x)!=find(t[i].y)){dist[++cnt]=t[i].w;unio(t[i].x,t[i].y);} }for(int i=1;i<n;i++){mincost+=dist[i];}return mincost;
}
int main(){while(scanf("%d",&n)!=EOF){init();for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(i==j){e[i][j]=0;}else{e[i][j]=inf;}}}double mincost=0;memset(dist,inf,sizeof(dist));for(int i=1;i<=n;i++){scanf("%lf %lf",&num[i].x,&num[i].y);}int cnt=0;for(int i=1;i<=n;i++){for(int j=1;j<=i;j++){t[++cnt].x=i;t[cnt].y=j;t[cnt].w=Dist(i,j);}}sort(t+1,t+cnt,cmp);mincost=Kruskal(cnt);cout<<setiosflags(ios::fixed)<<setprecision(2)<<mincost<<endl;}return 0;
}

HDU1162(Prim算法)相关推荐

  1. 数据结构与算法(7-3)最小生成树(普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法)

    目录 一.最小生成树简介 二.普里姆算法(Prim) 1.原理 2.存储 2-1.图顶点和权: 2-3. 最小生成树: 3.Prim()函数 3-1.新顶点入树 3-2.保留最小权 3-3. 找到最小 ...

  2. 基本数据结构(图: 基本结构,DFS,prim算法, kruskal算法)

    #include <iostream> using namespace std; //约定: //1. 图是由很多节点(VERTEX)构成的, 因此图结构是由一个VERTEX的链表构成的, ...

  3. 【数据结构】最小生成树 Prim算法 Kruskal算法

    最小生成树应用场景: 假设以下场景,有一块木板,板上钉上一些钉子,这些钉子可以由一些细绳连接起来.假设每个钉子可以通过一根或者多根细绳连接起来,那么一定存在这样得情况,即用最少的细绳把所有的钉子连接起 ...

  4. HDU1863(Prim算法)

    方法一:Prim算法 #include<iostream> #include<algorithm> #include<cstring> #include<ve ...

  5. 生成树的概念,最小生成树Prim算法 Kruskal算法

    求解最小生成树可以用Prim算法 Kruskal算法

  6. 三十七、Prim算法--求解最小生成树

    一.Prim算法介绍 普利姆(Prim)算法求最小生成树,也就是在包含 n 个顶点的连通图中,找出只有(n-1)条边包含所有 n 个顶点的 连通子图,也就是所谓的极小连通子图 普利姆的算法如下: 设 ...

  7. POJ2728 Desert King ——01分数规划Dinkelbach迭代法+最小生成树prim算法

    首先,纪念我用Linux系统AC的第一题-   安装这个万恶的NOI Linux系统费了6小时的时间,不过好在最后终于装上了,但是因为我安装的Linux系统比较烂,还遭到了小花儿和js的鄙视,唉,本人 ...

  8. 一步一步写算法(之prim算法 中)

    原文:一步一步写算法(之prim算法 中) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] C)编写最小生成树,涉及创建.挑选和添加过程 MI ...

  9. Prim算法生成迷宫

    初始化地图 function initMaze(r,c){let row = new Array(2 * r + 1)for(let i = 0; i < row.length; i++){le ...

  10. prim算法_最小生成树的本质是什么?Prim算法道破天机

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法和数据结构专题20篇文章,我们继续最小生成树算法,来把它说完. 在上一篇文章当中,我们主要学习了最小生成树的Kruskal算法.今 ...

最新文章

  1. android 星星流逝动画,Android Loading动画分析--续集
  2. 不是微型计算机主板上的部件,微型计算机主板上安装的主要部件
  3. ContentProvider初探
  4. HALCON示例程序measure_ring.hdev齿轮齿宽度测量
  5. [JavaWeb-MySQL]SQL基本概念,通用语法,分类
  6. LeetCode 1137. 第 N 个泰波那契数
  7. c++ 读取访问权限冲突_Linux系统利用可执行文件的Capabilities实现权限提升
  8. (77)FPGA时序违例及解决办法-面试必问(一)(第16天)
  9. 基于同义词词林的文本相似度算法研究语料库
  10. 主成分分析法(PCA)原理和步骤
  11. matlab LSB算法的三种改进
  12. hdu 3987 - 最小割最少割边
  13. JS·经典·炫彩菜单(动画效果) for jquery
  14. 职场险恶,程序员看完都惊呆了
  15. 超级详细VM16虚拟机安装CentOS 6.8创建虚拟机
  16. ESP8266-天猫精灵(智能家居)
  17. 用命令操作方式创建和管理数据库
  18. 10005 内联函数
  19. 51nod3137 圆形巧克力
  20. Linux 内存分配

热门文章

  1. Flask-RESTful的简单使用
  2. Unet神经网络为什么会在医学图像分割表现好?
  3. 基于OpenCV实现口罩识别
  4. 深度学习框架简史 (A Brief History of Deep Learning Frameworks)
  5. 链表问题10——两个单链表生成相加链表(方法二)
  6. 为增进理解力而奋斗终身
  7. 【SVN】1. SVN 安装部署
  8. SDCC 2016 中国软件开发者大会盛大开幕
  9. 如何评估互阻抗放大器(第 2 部分)
  10. fullpage的应用