HDU 1875 最小生成树prim算法
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define MAX 0xffffffff //定义一个最小生成树中不可能达到的值
const int qq=+; // 点的上限
using namespace std;
struct point{
int x,y;
}node[qq];
double lowcost[qq][qq]; // 邻接矩阵
int vis[qq]; // 最小生成树的点集合vis数组
int n;
double f(point a,point b)
{
return sqrt(pow(a.x-b.x,2.0)+pow(a.y-b.y,2.0));
}
void build()
{
double len;
for(int j,i=;i<n;++i)
for(j=i;j<n;++j){
len=f(node[i],node[j]); // 计算两点之间的距离也就是点与点的权值、
if(len>=&&len<=)
lowcost[i][j]=lowcost[j][i]=(i==j)?:len;
else
lowcost[i][j]=lowcost[j][i]=MAX; // 值为MAX 意味着这两点不连通、
}
}
void prim()
{
int k,t=n;
double min,tot=;
vis[]=; //初始点0进入最小生成树数组中、
while(--t){
min=MAX;
for(int i=;i<n;++i){
if(vis[i]!=&&lowcost[][i]<min){ //lowcost[0]代表当前的最小生成树的最小权值数组、
min=lowcost[][i]; //找到当前最小的权值并记录是哪一个点、
k=i;
}
}
if(min==MAX) break; //如果最小权值都为MAX 也就是不连通也可以跳出循环了、
vis[k]=; // 点k进入最小生成树数组、
tot+=min; //统计权值、
for(int i=;i<n;++i) //因为加入了一个点到最小生成树中,所以要更新当前的最小权值数组、
if(vis[i]!=&&lowcost[k][i]<lowcost[][i])
lowcost[][i]=lowcost[k][i];
}
if(t==) printf("%.1f\n",tot*);
else printf("oh!\n");
}
int main()
{
int t;cin >> t;
while(t--){
memset(vis,,sizeof(vis)); //清空标记数组、
scanf("%d",&n);
for(int i=;i<n;++i)
scanf("%d%d",&node[i].x,&node[i].y);
build();
prim();
}
}
刚做这题我模型没转换过来,以为只要把横坐标按从小到大排序,横坐标相同就按纵坐标从小到大排序然后然后从左到右从下道上连接各点就是最小生成树、
- - 、 错的太离谱了,代码就不拿出来丢脸了
题目设置的限制条件实际上就是不连通,这点想通了就好做了
HDU 1875 最小生成树prim算法的更多相关文章
- hdu 1233(最小生成树 prim算法)
还是畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。
//归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...
- 最小生成树Prim算法(邻接矩阵和邻接表)
最小生成树,普利姆算法. 简述算法: 先初始化一棵只有一个顶点的树,以这一顶点开始,找到它的最小权值,将这条边上的令一个顶点添加到树中 再从这棵树中的所有顶点中找到一个最小权值(而且权值的另一顶点不属 ...
- 最小生成树—prim算法
最小生成树prim算法实现 所谓生成树,就是n个点之间连成n-1条边的图形.而最小生成树,就是权值(两点间直线的值)之和的最小值. 首先,要用二维数组记录点和权值.如上图所示无向图: int map[ ...
- Highways POJ-1751 最小生成树 Prim算法
Highways POJ-1751 最小生成树 Prim算法 题意 有一个N个城市M条路的无向图,给你N个城市的坐标,然后现在该无向图已经有M条边了,问你还需要添加总长为多少的边能使得该无向图连通.输 ...
- SWUST OJ 1075 求最小生成树(Prim算法)
求最小生成树(Prim算法) 我对提示代码做了简要分析,提示代码大致写了以下几个内容 给了几个基础的工具,邻接表记录图的一个的结构体,记录Prim算法中最近的边的结构体,记录目标边的结构体(始末点,值 ...
- 图论算法(五)最小生成树Prim算法
最小生成树\(Prim\)算法 我们通常求最小生成树有两种常见的算法--\(Prim\)和\(Kruskal\)算法,今天先总结最小生成树概念和比较简单的\(Prim\)算法 Part 1:最小生成树 ...
- 最小生成树,Prim算法与Kruskal算法,408方向,思路与实现分析
最小生成树,Prim算法与Kruskal算法,408方向,思路与实现分析 最小生成树,老生常谈了,生活中也总会有各种各样的问题,在这里,我来带你一起分析一下这个算法的思路与实现的方式吧~~ 在考研中呢 ...
- MST(最小生成树)——Prim算法——HDU 1879-继续畅通工程
Prim算法很好理解,特别是学完了迪杰斯特拉算法之后,更加能理解Prim的算法思想 和迪杰斯特拉算法差不多,由于最后要形成连通图,故任意指定一个点,作为初始点,遍历所有点,以当前最小权值的点(和迪杰斯 ...
随机推荐
- Winform实现调用asp.net数据接口实例
本文实例讲述了Winform实现调用asp.net数据接口的方法,分享给大家供大家参考.具体实现方法如下: 一.问题: 最近一个WPF项目需要改写成android项目,思路是在asp.net项目中编写 ...
- Python单元测试浅析
测试的意义 人们针对一个具体问题,通过分析和设计,最后用编程语言写出了一个程序,如果它通过了语言解释器(编译器)的检查,可以运行了,那么下一步的工作就是设法确认它确实满足了我们需求.这篇文章就是讨 ...
- 写GULP遇到的ES6问题详解
Gulp.js 是一个自动化构建工具,开发者可以使用它在项目开发过程中自动执行常见任务.最近复习一下gulp一些基本的写法,在写了一些简单的uglify,rename,concat,clean的处理之 ...
- facebook第三方登录
一:创建和配置开发者应用 https://developers.facebook.com 登录开发者(可能要手机验证,身份证严重)->创建应用(web )->填写配置,网站网址和应用域名需 ...
- php刷新当前页面,js刷新页面
echo "<script language=JavaScript> location.replace(location.href);</script>"; ...
- jsp项目中整个项目没有问题但是servlet报错
项目没问题但是serverlet报错 项目右键 buildPath-->configure build path -->Myeclipse Library-->J2EE 1.3 Li ...
- python 顺序传入
- 利用IDEA构建springboot应用-配置文件
application.properties配置文件(不建议采用这种配置) 配置文件采用:application.yml文件会更简便,要带空格 属性配置与类中取值 添加bean属性配置到一个类里面,采 ...
- UVa 10323 【数学】
UVa 10323 题目:计算阶乘在10000~6227020800之间的值,不在范围对应输出Under或者Over. 分析:简单题.数论.因为13!=6227020800,7!<10000&l ...
- python 列表索引