| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
居然1A,本来没信心做出这道题#include <cstdio>
#include <vector>
#include <queue>
#include <memory.h>
#include <cmath>
#define maxn 1001
using namespace std;
struct Point{
Point(double a,double b):x(a),y(b){}
Point(double a,double b,int c):x(a),y(b),num(c){}
Point(){}
int num;
double x,y;
};
typedef Point Vector;
struct Segment{
Segment(Point a,Point b):Start(a),End(b){}
Segment(){}
Point Start,End;
};
struct Wall{
Wall(double a,Segment c,Segment d):x(a),a(c),b(d){}
Wall(){}
double x;
Segment a,b;
};
Vector operator-(Point a,Point b){
return Vector(a.x-b.x,a.y-b.y);
}
double Length(Point a,Point b){
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double Cross(Vector a,Vector b){
return a.x*b.y-a.y*b.x;
}
const double eps=1e-10;
int dcmp(double x){
if(fabs(x)<eps) return 0;
else return x>0?1:-1;
}
vector<Wall>de;
vector<Point>pot;
int N;
bool vis[maxn];
double dis[maxn];
bool JudgeSegmentInter(Segment a,Segment b)
{ double c1=Cross(a.End-a.Start,b.Start-a.Start),
c2=Cross(a.End-a.Start,b.End-a.Start),
c3=Cross(b.End-b.Start,a.Start-b.Start),
c4=Cross(b.End-b.Start,a.End-b.Start);
return dcmp(c1)*dcmp(c2)<0&&dcmp(c3)*dcmp(c4)<0;
}
bool JudgeRoad(Point a,Point b)
{ for(int i=0;i<de.size();++i)
{ if(a.x<de[i].x&&de[i].x<b.x)
{ if(!JudgeSegmentInter(Segment(a,b),de[i].a)&&
!JudgeSegmentInter(Segment(a,b),de[i].b))
return 0;
}
}
return 1;
}
void Spfa()
{ queue<Point>q;
Point now;
int i,j;
memset(vis,0,sizeof(vis));
for(i=0;i<pot.size();++i) dis[i]=100000;
q.push(pot[0]),vis[0]=1,dis[0]=0;
while(!q.empty())
{ now=q.front();
q.pop();
vis[now.num]=0;
for(i=now.num;i<pot.size();++i)
{ if(pot[i].x>now.x&&JudgeRoad(now,pot[i]))
{ if(dis[pot[i].num]>dis[now.num]+Length(pot[i],now))
{ dis[pot[i].num]=dis[now.num]+Length(pot[i],now);
if(!vis[pot[i].num])
{ vis[pot[i].num]=1;
q.push(pot[i]);
}
}
}
}
}
printf("%.2lf\n",dis[pot.size()-1]);
}
int main()
{ int i,len;
double a,b,c,d,e;
while(~scanf("%d",&N))
{ if(N==-1) break;
de.clear(),pot.clear();
len=0;
pot.push_back(Point(0,5,len++));
for(i=0;i<N;++i)
{ scanf("%lf%lf%lf%lf%lf",&a,&b,&c,&d,&e);
pot.push_back(Point(a,b,len++));
pot.push_back(Point(a,c,len++));
pot.push_back(Point(a,d,len++));
pot.push_back(Point(a,e,len++));
de.push_back(Wall(a,Segment(Point(a,b),Point(a,c)),
Segment(Point(a,d),Point(a,e))));
}
pot.push_back(Point(10,5,len++));
Spfa();
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator