HDU1162(Prim算法)
方法一: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算法)相关推荐
- 数据结构与算法(7-3)最小生成树(普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法)
目录 一.最小生成树简介 二.普里姆算法(Prim) 1.原理 2.存储 2-1.图顶点和权: 2-3. 最小生成树: 3.Prim()函数 3-1.新顶点入树 3-2.保留最小权 3-3. 找到最小 ...
- 基本数据结构(图: 基本结构,DFS,prim算法, kruskal算法)
#include <iostream> using namespace std; //约定: //1. 图是由很多节点(VERTEX)构成的, 因此图结构是由一个VERTEX的链表构成的, ...
- 【数据结构】最小生成树 Prim算法 Kruskal算法
最小生成树应用场景: 假设以下场景,有一块木板,板上钉上一些钉子,这些钉子可以由一些细绳连接起来.假设每个钉子可以通过一根或者多根细绳连接起来,那么一定存在这样得情况,即用最少的细绳把所有的钉子连接起 ...
- HDU1863(Prim算法)
方法一:Prim算法 #include<iostream> #include<algorithm> #include<cstring> #include<ve ...
- 生成树的概念,最小生成树Prim算法 Kruskal算法
求解最小生成树可以用Prim算法 Kruskal算法
- 三十七、Prim算法--求解最小生成树
一.Prim算法介绍 普利姆(Prim)算法求最小生成树,也就是在包含 n 个顶点的连通图中,找出只有(n-1)条边包含所有 n 个顶点的 连通子图,也就是所谓的极小连通子图 普利姆的算法如下: 设 ...
- POJ2728 Desert King ——01分数规划Dinkelbach迭代法+最小生成树prim算法
首先,纪念我用Linux系统AC的第一题- 安装这个万恶的NOI Linux系统费了6小时的时间,不过好在最后终于装上了,但是因为我安装的Linux系统比较烂,还遭到了小花儿和js的鄙视,唉,本人 ...
- 一步一步写算法(之prim算法 中)
原文:一步一步写算法(之prim算法 中) [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] C)编写最小生成树,涉及创建.挑选和添加过程 MI ...
- Prim算法生成迷宫
初始化地图 function initMaze(r,c){let row = new Array(2 * r + 1)for(let i = 0; i < row.length; i++){le ...
- prim算法_最小生成树的本质是什么?Prim算法道破天机
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法和数据结构专题20篇文章,我们继续最小生成树算法,来把它说完. 在上一篇文章当中,我们主要学习了最小生成树的Kruskal算法.今 ...
最新文章
- android 星星流逝动画,Android Loading动画分析--续集
- 不是微型计算机主板上的部件,微型计算机主板上安装的主要部件
- ContentProvider初探
- HALCON示例程序measure_ring.hdev齿轮齿宽度测量
- [JavaWeb-MySQL]SQL基本概念,通用语法,分类
- LeetCode 1137. 第 N 个泰波那契数
- c++ 读取访问权限冲突_Linux系统利用可执行文件的Capabilities实现权限提升
- (77)FPGA时序违例及解决办法-面试必问(一)(第16天)
- 基于同义词词林的文本相似度算法研究语料库
- 主成分分析法(PCA)原理和步骤
- matlab LSB算法的三种改进
- hdu 3987 - 最小割最少割边
- JS·经典·炫彩菜单(动画效果) for jquery
- 职场险恶,程序员看完都惊呆了
- 超级详细VM16虚拟机安装CentOS 6.8创建虚拟机
- ESP8266-天猫精灵(智能家居)
- 用命令操作方式创建和管理数据库
- 10005 内联函数
- 51nod3137 圆形巧克力
- Linux 内存分配