poj1292
prim,把每个墙看成一个节点,从起点用prim求最小生成树,直到覆盖到终点为止,输出最小生成树中的最大边
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <cstring>
using namespace std; #define MAX_WALL_NUM 1005
#define INF 0x3f3f3f3f struct Wall
{
int s, e, pos;
bool h; //direction: is horizental
}wall[MAX_WALL_NUM]; int wall_num;
double graph[MAX_WALL_NUM][MAX_WALL_NUM]; void input()
{
for (int i = ; i < wall_num; i++)
{
int x, y, l;
scanf("%d%d%d", &x, &y, &l);
if (l < )
{
wall[i].h = false;
swap(x, y);
}else
wall[i].h = true;
wall[i].s = x;
wall[i].e = x + abs(l);
wall[i].pos = y;
}
} bool overlap(Wall a, Wall b)
{
if (a.s > b.e || a.e < b.s)
return false;
return true;
} double cal(Wall a, Wall b)
{
if (a.h == b.h)
{
int dist1 = abs(a.pos - b.pos);
if (overlap(a, b))
return dist1;
else
{
int dist2 = min(abs(a.s - b.e), abs(a.e - b.s));
return sqrt(dist1 * dist1 + dist2 * dist2);
}
}
if (a.s <= b.pos && a.e >= b.pos && b.s <= a.pos && b.e >= a.pos)
return ;
if (a.s <= b.pos && a.e >= b.pos)
return min(abs(b.s - a.pos), abs(b.e - a.pos));
if (b.s <= a.pos && b.e >= a.pos)
return min(abs(a.s - b.pos), abs(a.e - b.pos));
int dist1 = min(abs(a.s - b.pos), abs(a.e - b.pos));
int dist2 = min(abs(b.s - a.pos), abs(b.e - a.pos));
return sqrt(dist1 * dist1 + dist2 * dist2);
} void calculate_graph()
{
for (int i = ; i < wall_num; i++)
{
for (int j = i + ; j < wall_num; j++)
{
graph[i][j] = graph[j][i] = cal(wall[i], wall[j]);
}
}
} double prim()
{
bool vis[MAX_WALL_NUM];
double dist[MAX_WALL_NUM];
memset(vis, , sizeof(vis));
fill(dist, dist + wall_num, INF);
dist[] = ;
double ret = ;
while (!vis[])
{
double min_dist = INF;
int temp = -;
for (int i = ; i < wall_num; i++)
if (!vis[i] && dist[i] < min_dist)
{
temp = i;
min_dist = dist[i];
}
if (temp == -)
return -;
vis[temp] = true;
dist[temp] = ;
ret = max(ret, min_dist);
for (int i = ; i < wall_num; i++)
dist[i] = min(dist[i], dist[temp] + graph[temp][i]);
}
return ret;
} int main()
{
while (scanf("%d", &wall_num), wall_num)
{
input();
calculate_graph();
printf("%.2f\n", prim());
}
return ;
}
poj1292的更多相关文章
随机推荐
- 使用Samba服务程序,让linux系统之间共享文件
yum install -y cifs-utils mkdir /database 创建挂载目录 在root家目录创建认证文件(依次为SMB用户名.SMB用户密码.SMB共享域) v ...
- final评论1
1-约跑APP 小组准备的非常的充分,还带了摄像头,发布过程清晰.团队的约跑项目界面相较于Beta版本进行了美化,增加了背景图片,使项目看起来更美观.同时项目支持聊天信息的接收和发送,个人觉得他们组的 ...
- Delphi字符串转日期,强大到窒息,VarToDateTime解决了困扰很久的小问题
procedure THRForm.Button1Click(Sender: TObject); var D:TDateTime; s:string; begin D:=VarToDateTime(' ...
- BZOJ2458 Beijing2011最小三角形(分治)
类似于平面最近点对,考虑分治,即分别计算分割线两侧的最小三角形再考虑跨过线的三角形. 复杂度证明也是类似的,对于某一个点,在另一侧可能与其构成最小三角形的点在一个d*d/2的矩形内(两边之和大于第三边 ...
- P2622 关灯问题II
题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯——按下了第i个按钮,对于所有的灯都有一个效果.按下i按钮对于第j盏灯,是下面3中效果之一:如果a[i][j]为1,那么当这盏灯开了的时 ...
- 洛谷P4180 [BJWC2010]次小生成树(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)
洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...
- BZOJ 百题纪念!
一百题辣! 现在NOI知识点中最基础的那部分已经学完了--这几天发现自己会写SA啊树剖啊可持久化Trie啊之类模板题--还挺开心的-- 逛了两天学长博客之后--BZOJ100题辣--也挺开心的-- 现 ...
- 解决 Microsoft Excel has stopped working
安装了project 2013后, excel 2013 一打开文件就报这个错,解决方法如下: Step1: Try to repair Office 2013 installation and ch ...
- Cocos2d-x 3.2 打包Android平台APK
(转自:http://www.cnblogs.com/Richard-Core/p/3855130.html) 从cocos2dx 3.2项目打包成apk安卓应用文件,搭建安卓环境的步骤有点繁琐,但搭 ...
- [Coci2015]Kamp
Description 一颗树n个点,n-1条边,经过每条边都要花费一定的时间,任意两个点都是联通的. 有K个人(分布在K个不同的点)要集中到一个点举行聚会. 聚会结束后需要一辆车从举行聚会的这点出发 ...