poj 1556 线段相交 + dijstra
来源:互联网 发布:手机如何注册淘宝会员 编辑:程序博客网 时间:2024/06/03 23:25
code :
#include <cstdio>#include <cmath>#include <vector>#include <cstring>using namespace std;typedef double ld;const ld eps = 1e-13;int n;ld dis[75][75], ans[75];ld x, d, md, mu, u;bool vis[75];struct Point { ld x, y; Point(ld _x, ld _y) : x(_x), y(_y) {}; Point operator - (const Point &rhs) const { return Point(x - rhs.x, y - rhs.y); } ld lenth() { return sqrt(x * x + y * y); } ld operator * (const Point &rhs) { return x * rhs.y - y * rhs.x; } friend ld len(Point &a, Point &b) { return (a - b).lenth(); }};struct Line { Point s, e; Line(Point _s, Point _e) : s(_s), e(_e) {};};vector<Point> vec;vector<Line> vLine;int ok(ld a) { if (a > eps) return 1; return fabs(a) < eps ? 0 : -1;}bool check(Line a, Line b) { ld l = (a.s - b.s) * (a.e - b.s), r = (a.s - b.e) * (a.e - b.e); ld u = (b.s - a.s) * (b.e - a.s), d = (b.s - a.e) * (b.e - a.e); return ok(l) * ok(r) >= 0 || ok(u) * ok(d) >= 0;}void solve() { for (int i = 0; i < vec.size(); ++i) { for (int j = i + 1; j < vec.size(); ++j) { if (fabs(vec[i].x - vec[j].x) < eps) continue; dis[i][j] = 51; bool f = 1; for (int k = 0; k < vLine.size(); ++k) { if (!check(Line(vec[i], vec[j]), vLine[k])) { f = 0; break; } } if (f) dis[i][j] = len(vec[i], vec[j]); } } //printf("mid\n"); memset(vis, 0, sizeof vis); for (int i = 1; i < vec.size(); ++i)ans[i] = dis[0][i]; //vis[0] = 1; ans[0] = 0; for (int i = 0; i < vec.size(); ++i) { //printf("s\n"); int u; ld mn = 51; for (int j = 0; j < vec.size(); ++j) { if (!vis[j] && ans[j] < mn) { mn = ans[j]; u = j; } } vis[u] = 1; for (int j = 0; j < vec.size(); ++j) { if (!vis[j] && (ans[u] + dis[u][j] < ans[j])) { ans[j] = ans[u] + dis[u][j]; } } } printf("%.2lf\n", ans[vec.size() - 1]);}int main() { while (~scanf("%d", &n), ~n) { vec.clear(); vLine.clear(); vec.push_back(Point(0, 5)); //printf("1\n"); for (int i = 1; i < 4 * n + 1; i += 4) { scanf("%lf%lf%lf%lf%lf", &x, &d, &md, &mu, &u); //printf("%lf %lf\n", x, d); vec.push_back(Point(x, d)); vec.push_back(Point(x, md)); vec.push_back(Point(x, mu)); vec.push_back(Point(x, u)); dis[i][i + 1] = dis[i + 1][i] = md - d; dis[i][i + 2] = dis[i + 2][i] = dis[i][i + 3] = dis[i + 3][i] = 50; dis[i + 1][i + 2] = dis[i + 1][i + 3] = dis[i + 2][i + 1] = dis[i + 3][i + 1] = 50; dis[i + 2][i + 3] = dis[i + 3][i + 2] = u - mu; vLine.push_back(Line(Point(x, 0), Point(x, d))); vLine.push_back(Line(Point(x, md), Point(x, mu))); vLine.push_back(Line(Point(x, u), Point(x, 10))); } vec.push_back(Point(10, 5)); //printf("111\n"); solve(); } return 0;}
0 0
- poj 1556 线段相交 + dijstra
- POJ 1556 线段相交
- POJ 1556 线段与线段相交 + dijkstra
- POJ 1556 The Doors (线段相交+Dijkstra)
- POJ 1556 线段相交+最短路
- poj-1556-The Doors-dij+线段相交
- POJ 1556 The Doors(线段相交)
- poj 1556 线段相交+最短路
- POJ 1556 The Doors【单源最短+线段相交】
- POJ 2653 线段相交
- POJ 1066 线段相交
- poj 1127(线段相交)
- POJ 1066 线段相交
- POJ 2653 线段相交
- POJ 1066 线段相交
- poj 2653(线段相交)
- POJ 1066 判断线段相交
- POJ 2653(线段相交)
- 一个小案例:用SysGen做一个DDS信号发生器并用FFT频谱分析 1.原理图
- node---http模块,如何用node.js做简单的服务器环境http.createServer
- 利用Base64对文本进行加密解密操作
- HDU 5253 连接的管道(最小生成树)
- java数组中根据元素查找位置 索引
- poj 1556 线段相交 + dijstra
- For 循环编程题
- 用sax解析jsp页面时的问题
- android 7.0 app安装问题
- 数据表的创建
- 39.top10热门品类之自定义二次排序key
- (HTML5 )canvas 第八章
- Git仓库恢复
- POJ 2763 树链剖分+线段树维护区间和