The Doors--poj1556(最短路+判断点与线段的关系)
2016-04-25 17:37
197 查看
http://poj.org/problem?id=1556
题目大意:从(0,5)走到(10,5)走的最短距离是多少
中间有最多18个隔着的墙 每个墙都有两个门 你只能从门通过
我的思路是 只要这两个点把能过的 就把他们的距离算出来 最后用迪杰斯塔拉算法求最短路就行了
题目大意:从(0,5)走到(10,5)走的最短距离是多少
中间有最多18个隔着的墙 每个墙都有两个门 你只能从门通过
我的思路是 只要这两个点把能过的 就把他们的距离算出来 最后用迪杰斯塔拉算法求最短路就行了
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<ctype.h> #include<math.h> #include<algorithm> #include<iostream> using namespace std; #define N 200 const double ESP = 1e-8; #define INF 0xffffffff int vis ; double dis ; struct node { double x,y; int c; node(double x=0,double y=0,int c=0):x(x),y(y),c(c){} }p ; node a [5]; double G ; double dij(int s,int e) { memset(vis,0,sizeof(vis)); for(int i=0;i<e;i++) { dis[i]=G[s][i]; } for(int i=0;i<e;i++) { double Min=INF; int dist; for(int j=0;j<e;j++) { if(!vis[j] && Min>dis[j]) { Min=dis[j]; dist=j; } } vis[dist]=1; for(int j=0;j<e;j++) { if(!vis[j]) dis[j]=min(dis[j],dis[dist]+G[dist][j]); } } return dis[e-1]; } int main() { int n; double k ; while(scanf("%d",&n),n!=-1) { p[0]=node(0,5,0); int b=1; for(int i=1;i<=n;i++) { scanf("%lf",&k[i]); scanf("%lf %lf %lf %lf",&a[i][1].x,&a[i][1].y,&a[i][2].x,&a[i][2].y); p[b++]=node(k[i],a[i][1].x,i); p[b++]=node(k[i],a[i][1].y,i); p[b++]=node(k[i],a[i][2].x,i); p[b++]=node(k[i],a[i][2].y,i); } p[b++]=node(10,5,n+1); for(int i=0;i<b;i++) { for(int j=0;j<b;j++) { G[i][j]=INF; } dis[i]=INF; } for(int i=0;i<b;i++) { for(int j=i+1;j<b;j++) { if(p[i].c == p[j].c) continue; int flag=0; for(int l=p[j].c-1; l>p[i].c; l--) { double y=(k[l]-p[i].x)*(p[j].y-p[i].y)/(p[j].x-p[i].x)+p[i].y; if(a[l][1].x-y>ESP || (a[l][1].y-y<ESP && a[l][2].x-y>ESP) || (a[l][2].y-y<ESP)) { flag=1; break; } } if(flag==0) { G[i][j]=sqrt((p[j].x-p[i].x)*(p[j].x-p[i].x)+(p[j].y-p[i].y)*(p[j].y-p[i].y)); } } } double aa=dij(0,b); printf("%.2f\n",aa); } return 0; }
相关文章推荐
- 无废话MVC入门教程二
- 汇编语言学习第八章-数据处理的两个基本问题
- fragment中的头像更改后在另一个fragment中同时更新头像
- 中国剩余定理(互质+非互质)
- quick动态控制动画的播放速度
- Android-Notification推送栏通知
- HDOJ 2063-过山车【匈牙利算法】
- 邻接表递归深搜(无向图)
- Android开源项目分类汇总
- 使用r.js压缩整个项目的JavaScript文件
- USACO 2.1-Healthy Holsteins
- 冒泡型事件、捕获型事件
- Android之Glide使用详解--集成、配置、使用、特性
- Note: there were 157 duplicate class definitions
- 将json字符串转化为java对象
- C语言结构体复习
- 一款陌生人状态社交软件--same
- useradd 命令
- 用VS2005(其他版本也可以)调试dump文件
- Jquery获取cookies