poj 1556

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
#define mod 1000000000+7
const double EPS=1e-8;
using namespace std;
double add(double a,double b)
{
    if(abs(a+b)<EPS*(abs(a)+abs(b)))
		return 0;
    return a+b;
}
struct P
{
    double x,y;
    P (){}
    P(double x,double y):x(x),y(y){
    }
    P operator + (P p){
        return P(add(x,p.x),add(y,p.y));
    }
    P operator -(P p){
        return P(add(x,-p.x),add(y,-p.y));
    }
	P operator *(double d){
        return P(x*d,y*d);
    }
    double det(P p){
        return add(x*p.y,-y*p.x);
    }
    double dot(P p){
        return add(x*p.x,y*p.y);
    }
};
P p[20000],q[20000],r[20000];
struct node
{
    double val;
    int s,e,next;
}a[100000];
int root[100000];
int ans;
void add(int s,int e,double val)
{
    a[++ans].e=e;
    a[ans].val=val;
    a[ans].next=root[s];
    root[s]=ans;
}
int l=0,l2=0;
bool equ(P a,P b)
{
	if(fabs(a.x-b.x)<=EPS && fabs(a.y-b.y)<=EPS)
		return 1;
	return 0;
}
bool judge(int i,int j)
{
    for(int k=0;k<l;k++)
    {
		if(equ(q[k],r[i]) || equ(q[k],r[j]) || equ(p[k],r[i]) || equ(p[k],r[j]))
			continue;
        if((q[k]-r[i]).det(r[j]-r[i])*(p[k]-r[i]).det(r[j]-r[i])<EPS && (r[i]-q[k]).det(p[k]-q[k])*(r[j]-q[k]).det(p[k]-q[k])<EPS)
        {
            return 0;
        }
    }
    return 1;
}
double dit(int i,int j)
{
    double a=(r[i].x-r[j].x)*(r[i].x-r[j].x)+(r[i].y-r[j].y)*(r[i].y-r[j].y);
	return sqrt(a);
}
double spfa()
{
    int vis[100000];
    double dis[100000];
    for(int i=0;i<=l2;i++)
    {
        vis[i]=0;
        dis[i]=0x7fffffff;
    }
    queue<int>q;
    vis[0]=1;
    dis[0]=0;
	q.push(0);
    while(!q.empty())
    {
        int s=q.front();
		q.pop();
        vis[s]=0;
        for(int i=root[s];i!=-1;i=a[i].next)
        {
            if(dis[a[i].e]>dis[s]+a[i].val)
            {
                dis[a[i].e]=dis[s]+a[i].val;
                if(!vis[a[i].e])
                {
                    q.push(a[i].e);
                    vis[a[i].e]=1;
                }
            }
        }
    }
    return dis[l2-1];
}
int main()
{
    int n;
    while(~scanf("%d",&n) && n!=-1)
    {
		l2=0,l=0;
        memset(root,-1,sizeof(root));
        ans=-1;
		r[l2].x=0.0;
        r[l2++].y=5.0;
        double a,b,c,d,e,f;
        for(int i=0;i<n;i++)
        {
            scanf("%lf%lf%lf%lf%lf",&a,&b,&c,&d,&e);

            double x[100];
         //   x[0]=b,x[1]=c,x[2]=d,x[3]=e;
        //    sort(x,x+4);
         //   b=x[0],c=x[1],d=x[2],e=x[3];
            p[l].x=a;
            p[l].y=0.0;
            q[l].x=a;
            q[l].y=b;
                l++;
            p[l].x=a;
            p[l].y=c;
            q[l].x=a;
            q[l].y=d;
                l++;
            p[l].x=a;
            p[l].y=e;
            q[l].x=a;
            q[l].y=10.0;
            l++;

            r[l2].x=a;
            r[l2++].y=b;

            r[l2].x=a;
            r[l2++].y=c;

            r[l2].x=a;
            r[l2++].y=d;

            r[l2].x=a;
            r[l2++].y=e;


        }
        r[l2].x=10.0;
        r[l2++].y=5.0;
        for(int i=0;i<l2;i++)
        {
            for(int j=i+1;j<l2;j++)
            {
                if(judge(i,j))
                {
                    add(i,j,dit(i,j));
                    add(j,i,dit(i,j));
                }
            }
        }
        double aaaaa=spfa();
        printf("%.2lf\n",aaaaa);

	}
	return 0;
}

计算几何判断线段相交+最短路


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值