poj1556The Doors

链接

枚举两点 若不和任何线段相交 建边为dis(i,j) floyd求最短路

  1 #include <iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<stdlib.h>
  6 #include<vector>
  7 #include<cmath>
  8 #include<queue>
  9 #include<set>
 10 using namespace std;
 11 #define N 100
 12 #define LL long long
 13 #define INF 0xfffffff
 14 const double eps = 1e-8;
 15 const double pi = acos(-1.0);
 16 const double inf = ~0u>>2;
 17 struct point
 18 {
 19     double x,y;
 20     point(double x=0,double y=0):x(x),y(y){}
 21 }p[N];
 22 struct line
 23 {
 24     point u,v;
 25 }li[N];
 26 double w[N][N];
 27 typedef point pointt;
 28 pointt operator - (point a,point b)
 29 {
 30     return pointt(a.x-b.x,a.y-b.y);
 31 }
 32 int dcmp(double x)
 33 {
 34     if(fabs(x)<eps) return 0;
 35     return x<0?-1:1;
 36 }
 37 double dis(point a)
 38 {
 39     return sqrt(a.x*a.x+a.y*a.y);
 40 }
 41 double cross(point a,point b)
 42 {
 43     return a.x*b.y-a.y*b.x;
 44 }
 45 bool segprointer(point a1,point a2,point b1,point b2)
 46 {
 47     double c1 = cross(a2-a1,b1-a1),c2 = cross(a2-a1,b2-a1),
 48     c3  = cross(b2-b1,a1-b1),c4 = cross(b2-b1,a2-b1);
 49     return dcmp(c1)*dcmp(c2)<0&&dcmp(c3)*dcmp(c4)<0;
 50 }
 51 int main()
 52 {
 53     int n,i,j,k;
 54     while(scanf("%d",&n)!=EOF)
 55     {
 56         if(n==-1) break;
 57         int g = 0;
 58         for(i = 1; i <= 100 ; i++)
 59         {
 60             for(j = 1;  j<= 100 ; j++)
 61             w[i][j] = INF;
 62             w[i][i] = 0;
 63         }
 64         int o = 0;
 65         for(i = 1; i <= n ;i++)
 66         {
 67             double k;
 68             scanf("%lf",&k);
 69             for(j = 1; j <= 4; j++)
 70             {
 71                 p[++g].x = k;
 72                 scanf("%lf",&p[g].y);
 73             }
 74             point pp = point(k,0);
 75             li[++o].u = pp;
 76             li[o].v = p[g-3];
 77             li[++o].u = p[g-2];
 78             li[o].v = p[g-1];
 79             li[++o].u = p[g];
 80             pp = point(k,10);
 81             li[o].v = pp;
 82         }
 83         p[g+1] = point(0,5);
 84         p[g+2] = point(10,5);
 85         //printf("%d\n",segprointer(p[g+1],p[g+2],li[5].u,li[5].v));
 86         for(i = 1; i <= g+2; i++)
 87             for(j = i+1; j <= g+2; j++)
 88             {
 89                 if(i==j) continue;
 90                 for(k = 1; k <= o ; k++)
 91                 {
 92                     if(segprointer(p[i],p[j],li[k].u,li[k].v))break;
 93 
 94                 }
 95                 if(k>o)
 96                 w[i][j] = w[j][i] = dis(p[i]-p[j]);
 97                 //printf("%.2f %.2f %.2f %.2f %.2f\n",p[i].x,p[i].y,p[j].x,p[j].y,w[i][j]);
 98             }
 99         for(i = 1; i <= g+2 ; i++)
100             for(j = 1; j <=g+2 ;j++)
101                 for(k = 1; k <= g+2 ; k++)
102                 w[j][k] = min(w[j][i]+w[i][k],w[j][k]);
103         printf("%.2f\n",w[g+1][g+2]);
104     }
105     return 0;
106 }
View Code

 

posted @ 2014-07-31 21:44  _雨  阅读(195)  评论(0编辑  收藏  举报