The Doors 最短路 + 简单几何

                        The Doors

题目抽象:给你一些点,和一些阻碍连边的线段。问原点到终点最短的几何距离。

分析:预处理见图之后,跑最短路。

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <cmath>
  5 using namespace std;
  6 const int INF = 0X5FFFFFFF;
  7 const int MS = 1005;
  8 const int MS2 = 100;
  9
 10 struct point {
 11     double x, y;
 12    // point(double _x = 0, double _y = 0) : x(_x), y(_y) {}
 13     //长期不更新编译器的oj,可能不支持pioint{}初始化。 可以改为构造函数point()初始化。
 14 }points[MS];
 15 struct edge {
 16     int u, v;
 17     double w;
 18 }edges[MS * MS];
 19
 20 int pSize, eSize;
 21 int n;
 22
 23 double w[MS], wY[MS][4];
 24 double dis[MS];
 25
 26 double D(const point &a, const point &b) {
 27     return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
 28 }
 29
 30 double C(const point &a, const point &b, const point &c) {
 31     return (c.y - a.y) * (a.x - b.x) - (a.y - b.y) * (c.x - a.x);
 32 }
 33
 34 bool isOk(const point &a,const point &b) {
 35     if (a.x >= b.x)
 36         return false;
 37     int i = 0;
 38     while (i < n && w[i] <= a.x)
 39         i++;
 40     while (i < n && w[i] < b.x ) {
 41         if (C(a, b, point{w[i],0}) * C(a, b, point{w[i],wY[i][0]}) < 0)
 42             return false;
 43         if (C(a, b, point{w[i],wY[i][1]}) * C(a, b, point{w[i], wY[i][2]}) < 0)
 44             return false;
 45         if (C(a, b, point{w[i], wY[i][3]}) * C(a, b, point{w[i], 10.0}) < 0)
 46             return false;
 47         i++;
 48     }
 49     return true;
 50 }
 51
 52 int input() {
 53     scanf("%d", &n);
 54     if (n == -1)
 55         return 0;
 56     pSize = 0;
 57     points[pSize].x = 0;
 58     points[pSize++].y = 5;
 59     for (int i = 0; i < n; i++) {
 60         scanf("%lf", &w[i]);
 61         for (int j = 0;j < 4;j ++) {
 62             points[pSize].x = w[i];
 63             scanf("%lf", &wY[i][j]);
 64             points[pSize++].y = wY[i][j];
 65         }
 66     }
 67     points[pSize].x = 10;
 68     points[pSize++].y = 5;
 69
 70     eSize = 0;
 71     for (int i = 0; i < pSize; i++) {
 72         for (int j = i + 1;j < pSize; j++) {
 73             if (isOk(points[i], points[j])) {
 74                 edges[eSize].u = i;
 75                 edges[eSize].v = j;
 76                 edges[eSize++].w = D(points[i], points[j]);
 77             }
 78         }
 79     }
 80     return 1;
 81 }
 82
 83 void Bellman(int v0) {
 84     for (int i = 0; i < pSize; i++)
 85         dis[i] = INF;     //  fill(dis,dis + pSize, INF )
 86     dis[v0] = 0.0;
 87     int flag = 1;
 88     for (int t = 1; t < pSize && flag; t++) {
 89         flag = 0;
 90         for (int i = 0; i < eSize; i++) {
 91             if (dis[edges[i].u] + edges[i].w < dis[edges[i].v]) {
 92                 dis[edges[i].v] = dis[edges[i].u] + edges[i].w;
 93                 flag = 1;
 94             }
 95         }
 96     }
 97 }
 98
 99 int main() {
100     while (input()) {
101         Bellman(0);
102         printf("%.2lf\n", dis[pSize -1]);
103     }
104     return 0;
105 }
时间: 2024-10-12 17:49:13

The Doors 最短路 + 简单几何的相关文章

HDU1245 Saving James Bond(最短路+简单几何)

Saving James Bond Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2405    Accepted Submission(s): 454 Problem Description This time let us consider the situation in the movie "Live and Let Die&

Python下opencv使用笔记(二)(简单几何图像绘制)

简单几何图像一般包括点.直线.矩阵.圆.椭圆.多边形等等.首先认识一下opencv对像素点的定义.图像的一个像素点有1或者3个值,对灰度图像有一个灰度值,对彩色图像有3个值组成一个像素值,他们表现出不同的颜色. 那么有了点才能组成各种多边形. (一)首先绘制直线 函数为:cv2.line(img,Point pt1,Point pt2,color,thickness=1,line_type=8 shift=0) 有值的代表有默认值,不用给也行.可以看到这个函数主要接受参数为两个点的坐标,线的颜色

POJ 1473 There&#39;s Treasure Everywhere!(简单几何)

There's Treasure Everywhere! 博客原文地址:http://blog.csdn.net/xuechelingxiao/article/details/40865611 题目大意: 给你一个字符串,里面有许多的操作,前面的数字是移动的距离,后面的英文表示移动的方向,问最后从远点出发的一个点回落在什么地方以及距离出发点的距离是多少. 解题思路: 题目本身并不是很难,也没有什么坑点,没什么好说的,字符串处理的时候细心一点就行. PS:每组后面需要加一个回车,因为这个PE了一次

简单几何 UVA 11178 Morley&#39;s Theorem

题目传送门 题意:莫雷定理,求三个点的坐标 分析:训练指南P259,用到了求角度,向量旋转,求射线交点 /************************************************ * Author :Running_Time * Created Time :2015/10/21 星期三 15:56:27 * File Name :UVA_11178.cpp ************************************************/ #include

HDU 4793 Collision + HDU 4798 Skycity 简单几何

HDU 4793 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4793 题意:给一个以(0,0)为圆心半径为R的圆形区域,中间放着一个(0,0)为圆心半径为Rm的圆盘,在坐标(x,y)处(严格在圆形区域外)放着一枚半径为r的硬币,运动方向和速度为(vx,vy),在运动中碰到圆盘时,会按碰撞问题反弹(圆盘是固定不动的),问硬币会在圆形区域里呆多长时间(硬币只要有一点点在圆形区域里就记为硬币在圆形区域内). 思路:首先先计算出硬币在移动过程中如果不与圆盘

hdu5365 简单几何问题

http://acm.hdu.edu.cn/showproblem.php?pid=5365 Problem Description AFA is a girl who like runing.Today,he download an app about runing .The app can record the trace of her runing.AFA will start runing in the park.There are many chairs in the park,and

简单几何(线段相交+最短路) POJ 1556 The Doors

题目传送门 题意:从(0, 5)走到(10, 5),中间有一些门,走的路是直线,问最短的距离 分析:关键是建图,可以保存所有的点,两点连通的条件是线段和中间的线段都不相交,建立有向图,然后用Dijkstra跑最短路.好题! /************************************************ * Author :Running_Time * Created Time :2015/10/24 星期六 09:48:49 * File Name :POJ_1556.cpp

The Doors POJ - 1556(几何+图)

The Doors 题目链接:https://vjudge.net/problem/POJ-1556 题目: 思路:就是判断线段与线段是否相交,符合条件就加入图中,建完图后跑dij就行了,求最短路,,看了大神的.. #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<cmath> #define Max 105 #define eps 1e-

CodeForces 703C Chris and Road (简单几何)

题意:有一个n边形的汽车向以速度v向x轴负方向移动,给出零时时其n个点的坐标.并且有一个人在(0,0)点,可以以最大速度u通过w宽的马路,到达(0,w)点.现在要求人不能碰到汽车,人可以自己调节速度.问人到达马路对面的最小时间是多少? 析:这个题是一个简单的分类讨论,很明显只有两种情况,第一种,直接到达w,不会被车撞到,答案就是w/u, 第二种是切着车过去,或者是等车过去再过去,只要枚举车的每个顶点,找到最后通过y轴的点就好,或者根本不会与车相切. 代码如下: #pragma comment(l