您的位置:首页 > 其它

poj1556The Doors

2014-07-31 21:44 302 查看
链接

枚举两点 若不和任何线段相交 建边为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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: