博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj1292
阅读量:6882 次
发布时间:2019-06-27

本文共 2669 字,大约阅读时间需要 8 分钟。

prim,把每个墙看成一个节点,从起点用prim求最小生成树,直到覆盖到终点为止,输出最小生成树中的最大边

#include 
#include
#include
#include
#include
using namespace std;#define MAX_WALL_NUM 1005#define INF 0x3f3f3f3fstruct 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 = 0; i < wall_num; i++) { int x, y, l; scanf("%d%d%d", &x, &y, &l); if (l < 0) { 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 0; 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 = 0; i < wall_num; i++) { for (int j = i + 1; 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, 0, sizeof(vis)); fill(dist, dist + wall_num, INF); dist[0] = 0; double ret = 0; while (!vis[1]) { double min_dist = INF; int temp = -1; for (int i = 0; i < wall_num; i++) if (!vis[i] && dist[i] < min_dist) { temp = i; min_dist = dist[i]; } if (temp == -1) return -1; vis[temp] = true; dist[temp] = 0; ret = max(ret, min_dist); for (int i = 0; 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 0;}
View Code

 

转载于:https://www.cnblogs.com/rainydays/p/3293277.html

你可能感兴趣的文章
Flutter Web - 目标全平台开发的Flutter再下一城!
查看>>
RAID-10 阵列的创建(软)
查看>>
小菜鸡进阶之路-First week
查看>>
【原创翻译】布尔值(boolean)
查看>>
关于scrapy的piplines
查看>>
通向架构师的道路(第一天)之Apache整合Tomcat - lifetragedy的专栏 - 博客频道 - CSDN.NET...
查看>>
Javascript创建对象的7种模式
查看>>
Shell工作笔记01
查看>>
项目、软件开发过程中版本术语
查看>>
CSS实现背景透明,文字不透明(各浏览器兼容)
查看>>
【转】[大学引导]超级链接、字体颜色、音乐播放公式
查看>>
T-SQL中INSERT、UPDATE
查看>>
Linux下Nginx服务器配置Modsecurity实现Web应用防护系统
查看>>
openSUSE13.2安装ruby和rails
查看>>
python 高级函数
查看>>
F.Cards with Numbers
查看>>
简单入门Buffer
查看>>
OO第四阶段总结
查看>>
javascript总结02
查看>>
创建windows服务
查看>>