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的算法思想 和迪杰斯特拉算法差不多,由于最后要形成连通图,故任意指定一个点,作为初始点,遍历所有点,以当前最小权值的点(和迪杰斯 ...
随机推荐
- org.dom4j.Document 解析xml
1.Java代码 Document doc = DocumentHelper.parseText(xml); // Element rootE = doc.getRootElement(); List ...
- python进程间通信 queue pipe
python进程间通信 1 python提供了多种进程通信的方式,主要Queue和Pipe这两种方式,Queue用于多个进程间实现通信,Pipe是两个进程的通信 1.1 Queue有两个方法: Put ...
- 有意思的DP(CF360B Levko and Array)
刚才面试了一个蛮有意思的DP题目,脑子断片,没写出来,不过早上状态还是蛮好的 一个长度为n的序列最多改变k次,使相邻两数之差绝对值的最大值最小 三维的dp我先尝试写一下 Codeforces 360B ...
- mysql各个引擎区别
1.如果你有一个 MyISAM 数据表包含着 FULLTEXT 或 SPATIAL 索引,你将不能把它转换为使用 另一种引擎,因为只有 MyISAM 支持这两种索引. 2. 如果你有一个数据表包含着一 ...
- 利用JDBC连接Oracle数据库(转)
http://blog.csdn.net/wahaha1_/article/details/8512438 JDBC是Sun公司制定的一个可以用Java语言连接数据库的技术. 一.JDBC基础知识 J ...
- U盘安装win7 raid设置
需要先安装驱动! 大白菜U盘安装界面有一个选择驱动的选项,选择驱动即可.Intel_ESRT2_Windows_signed_DRV_v16.03.2014.1127
- MySql实现Oracle的row_number()over(partition by ... order by ...)
SELECT IF(t1.id = @id,@rownum := @rownum + 1,@rownum := 1)AS rownum, t1.*, @id := t1.id FROM (SELECT ...
- jquery 回车提交事件
$("body").keydown(function(){ if(event.keyCode == "13"){ //13是回车键的位置 } })
- bzoj1877 晨跑
Description Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他 坚持下来的只有晨跑. 现在给出一张学校附近的地图,这张地图中包含N个 ...
- celery 动态定时任务探索
环境: celery 4.3 flask python 3.7 linux 需求: 动态添加定时任务,且方便维护. 解决思路: 参考django-celery 或是celery源码,将定时任务配置放置 ...