poj1556The Doors
2014-07-31 21:44
302 查看
链接
枚举两点 若不和任何线段相交 建边为dis(i,j) floyd求最短路
View Code
枚举两点 若不和任何线段相交 建边为dis(i,j) floyd求最短路
#include <iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<stdlib.h> #include<vector> #include<cmath> #include<queue> #include<set> using namespace std; #define N 100 #define LL long long #define INF 0xfffffff const double eps = 1e-8; const double pi = acos(-1.0); const double inf = ~0u>>2; struct point { double x,y; point(double x=0,double y=0):x(x),y(y){} }p ; struct line { point u,v; }li ; double w ; typedef point pointt; pointt operator - (point a,point b) { return pointt(a.x-b.x,a.y-b.y); } int dcmp(double x) { if(fabs(x)<eps) return 0; return x<0?-1:1; } double dis(point a) { return sqrt(a.x*a.x+a.y*a.y); } double cross(point a,point b) { return a.x*b.y-a.y*b.x; } bool segprointer(point a1,point a2,point b1,point b2) { double c1 = cross(a2-a1,b1-a1),c2 = cross(a2-a1,b2-a1), c3 = cross(b2-b1,a1-b1),c4 = cross(b2-b1,a2-b1); return dcmp(c1)*dcmp(c2)<0&&dcmp(c3)*dcmp(c4)<0; } int main() { int n,i,j,k; while(scanf("%d",&n)!=EOF) { if(n==-1) break; int g = 0; for(i = 1; i <= 100 ; i++) { for(j = 1; j<= 100 ; j++) w[i][j] = INF; w[i][i] = 0; } int o = 0; for(i = 1; i <= n ;i++) { double k; scanf("%lf",&k); for(j = 1; j <= 4; j++) { p[++g].x = k; scanf("%lf",&p[g].y); } point pp = point(k,0); li[++o].u = pp; li[o].v = p[g-3]; li[++o].u = p[g-2]; li[o].v = p[g-1]; li[++o].u = p[g]; pp = point(k,10); li[o].v = pp; } p[g+1] = point(0,5); p[g+2] = point(10,5); //printf("%d\n",segprointer(p[g+1],p[g+2],li[5].u,li[5].v)); for(i = 1; i <= g+2; i++) for(j = i+1; j <= g+2; j++) { if(i==j) continue; for(k = 1; k <= o ; k++) { if(segprointer(p[i],p[j],li[k].u,li[k].v))break; } if(k>o) w[i][j] = w[j][i] = dis(p[i]-p[j]); //printf("%.2f %.2f %.2f %.2f %.2f\n",p[i].x,p[i].y,p[j].x,p[j].y,w[i][j]); } for(i = 1; i <= g+2 ; i++) for(j = 1; j <=g+2 ;j++) for(k = 1; k <= g+2 ; k++) w[j][k] = min(w[j][i]+w[i][k],w[j][k]); printf("%.2f\n",w[g+1][g+2]); } return 0; }
View Code
相关文章推荐
- POJ 1556 The Doors 计算几何+MST
- POJ 1556 The Doors(计算几何+最短路)
- poj 1556 The Doors
- [POJ 1556]The Doors
- poj 1556 The Doors 最短路
- poj 1556 The Doors (线段之间位置的判断+最短路)
- POJ 1556 The Doors(判断线段相交 && 最短路)
- POJ 1556 E - The Doors
- poj 1556 The Doors (bellman+几何)
- 简单几何(线段相交+最短路) POJ 1556 The Doors
- POJ 1556 The Doors(计算几何+最短路)
- POJ1556——The Doors 计算几何,最短路
- POJ 1556 The Doors (线段相交+Dijkstra)
- 【计算几何】 POJ 1556 The Doors
- The Doors(poj1556线段相交+最短路径)
- [POJ 1556]The Doors
- Poj 1556 The Doors
- poj 1556 The Doors
- poj 1556 The Doors 线段相交判断+最短路
- POJ 1556 The Doors