poj 1556(迪杰斯特拉+计算几何)
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 7641 | Accepted: 2987 |
Description

Input
2
4 2 7 8 9
7 3 4.5 6 7
The first line contains the number of interior walls. Then there is a
line for each such wall, containing five real numbers. The first number
is the x coordinate of the wall (0 < x < 10), and the remaining
four are the y coordinates of the ends of the doorways in that wall. The
x coordinates of the walls are in increasing order, and within each
line the y coordinates are in increasing order. The input file will
contain at least one such set of data. The end of the data comes when
the number of walls is -1.
Output
output should contain one line of output for each chamber. The line
should contain the minimal path length rounded to two decimal places
past the decimal point, and always showing the two decimal places past
the decimal point. The line should contain no blanks.
Sample Input
1
5 4 6 7 8
2
4 2 7 8 9
7 3 4.5 6 7
-1
Sample Output
10.00
10.06 不错的一个题.
题意:求(0,5)和(10,5)两个点之间的最短距离
先把每个点和每条线段记录下来,然后每两个点之间如果能够直连就根据下标记录下来距离(这里要判断两个点连成的线段是否与其之间的所有线段有交点,有交点就不能直连,我用了两个变量对自身线段做了特判)然后用最短路算法进行求解。三层循环0MS,这题数据也是水。
#include <iostream>
#include <cstdio>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std; struct Point{
double x,y;
}p[];
struct Line{
Point a,b;
}line[];
int n;
const double INF = ;
double mp[][];
double low[];
bool vis[];
double dijstra(int n){
memset(vis,false,sizeof(vis));
memset(low,,sizeof(low));
int pos = ;
vis[pos]=true;
for(int i=;i<=n;i++){
low[i] = mp[pos][i];
}
for(int i=;i<n-;i++){
int mi = INF;
for(int j=;j<=n;j++){
if(!vis[j]&&mi>low[j]){
pos = j;
mi = low[j];
}
}
vis[pos] = true;
for(int j=;j<=n;j++){
if(!vis[j]&&mp[pos][j]+low[pos]<low[j]){
low[j] = mp[pos][j]+low[pos];
}
}
}
return low[n];
}
double dis(Point a,Point b){
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
} ///叉积
double mult(Point a, Point b, Point c)
{
return (a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y);
} ///a, b为一条线段两端点c, d为另一条线段的两端点 相交返回true, 不相交返回false
bool isCross(Point a, Point b, Point c, Point d)
{
if (max(a.x,b.x)<min(c.x,d.x))return false;
if (max(a.y,b.y)<min(c.y,d.y))return false;
if (max(c.x,d.x)<min(a.x,b.x))return false;
if (max(c.y,d.y)<min(a.y,b.y))return false;
if (mult(c, b, a)*mult(b, d, a)<)return false;
if (mult(a, d, c)*mult(d, b, c)<)return false;
return true;
}
void addline(double x,double y1,double y2,int &k){
line[k].a.x = line[k].b.x =x;
line[k].a.y = y1;
line[k].b.y = y2;
k++;
} int main()
{
while(scanf("%d",&n)!=EOF&&n!=-){
int k = ,m=; ///k代表线段的条数,m代表点的个数
p[].x = ,p[].y = ; ///起点
for(int i=;i<n;i++){
double x,y1,y2,y3,y4;
scanf("%lf%lf%lf%lf%lf",&x,&y1,&y2,&y3,&y4);
p[m].x =x,p[m++].y = y1;
p[m].x =x,p[m++].y = y2;
p[m].x =x,p[m++].y = y3;
p[m].x =x,p[m++].y = y4;
addline(x,,y1,k);
addline(x,y2,y3,k);
addline(x,y4,,k);
}
p[m].x = ,p[m].y = ; ///终点
for(int i=;i<=m;i++){
for(int j=;j<=m;j++) mp[i][j]=INF;
}
for(int i=;i<=m;i++){
for(int j=i+;j<=m;j++){
Line l;
l.a.x = p[i].x,l.a.y = p[i].y;
l.b.x = p[j].x,l.b.y = p[j].y;
if(l.a.x==l.b.x) continue;
int temp,temp1;
for(int t=;t<k;t++){ ///特判
if(line[t].a.x==p[j].x&&line[t].a.y==p[j].y) {
temp = t;break;
}
if(line[t].b.x==p[j].x&&line[t].b.y==p[j].y) {
temp = t;break;
}
}
for(int t=;t<k;t++){
if(line[t].a.x==p[i].x&&line[t].a.y==p[i].y) {
temp1 = t;break;
}
if(line[t].b.x==p[i].x&&line[t].b.y==p[i].y) {
temp1 = t;break;
}
}
bool flag = true;
for(int t=;t<k;t++){
if(t==temp||t==temp1) continue;
if(isCross(l.a,l.b,line[t].a,line[t].b)){
flag = false;
break;
}
}
if(flag){
mp[i][j] = mp[j][i] = dis(p[i],p[j]);
}
}
}
double ans = dijstra(m);
printf("%.2lf\n",ans);
}
return ;
}
poj 1556(迪杰斯特拉+计算几何)的更多相关文章
- POJ 2502 Subway(迪杰斯特拉)
Subway Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6692 Accepted: 2177 Descriptio ...
- POJ 1062 昂贵的聘礼 (最短路 迪杰斯特拉 )
题目链接 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请 ...
- Poj 3268 Silver cow party 迪杰斯特拉+反向矩阵
Silver cow party 迪杰斯特拉+反向 题意 有n个农场,编号1到n,每个农场都有一头牛.他们想要举行一个party,其他牛到要一个定好的农场中去.每个农场之间有路相连,但是这个路是单向的 ...
- C#迪杰斯特拉算法
C#迪杰斯特拉算法 网上有许多版本的,自己还是写一个理解点 Dijkstra.cs public class Dijkstra { private List<Node> _nodes; p ...
- C++迪杰斯特拉算法求最短路径
一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...
- 【算法杂谈】LJX的迪杰斯特拉算法报告
迪杰斯特拉(di jie qi)算法 这里有一张图: 假设要求从1号节点到5号节点的最短路.那么根据迪杰斯特拉算法的思想,我们先看: 节点1,从节点1出发的一共有3条路,分别是1-6.1-3.1-2. ...
- C# 迪杰斯特拉算法 Dijkstra
什么也不想说,现在直接上封装的方法: using System; using System.Collections.Concurrent; using System.Collections.Gener ...
- 迪杰斯特拉(dijkstra)算法的简要理解和c语言实现(源码)
迪杰斯特拉(dijkstra)算法:求最短路径的算法,数据结构课程中学习的内容. 1 . 理解 算法思想::设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合 ...
- 图-最短路径-Dijktra(迪杰斯特拉)算法
1. 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉算法于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以起始 ...
随机推荐
- 软工实践Beta冲刺(4/7)
队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 1.界面的修改与完善 展示GitHub当日代码/文档签入记 ...
- 【Linux】——搭建redis
1.准备安装文件 redis-3.0.5.tar.gz redis-desktop-manager(可视化管理工具) 2.解压.编译 软件存放目录:/usr/local/software 解压存放路径 ...
- 安全警告——“Windows已经阻止此软件因为无法验证发行者”解决办法
步骤:打开IE工具-->Internet选项-->安全-->自定义级别 -->找到ActiveX 控件和插件,按照图里进行配置.
- visio中相关设置-菜单视图
1.获取或设置窗口中页面的当前显示大小(缩放系数) Window.Zoom Dim dZoom As Double dZoom = m_Visio.Window.Zoom'获取显示比例 m_Visio ...
- [Leetcode] Roman to integer 罗马数字转成整数
Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 t ...
- AOJ.502 不只是水仙花
不只是水仙花 Time Limit: 1000 ms Case Time Limit: 1000 ms Memory Limit: 64 MB Total Submission: 1196 Submi ...
- BZOJ 4318: OSU! 期望概率dp && 【BZOJ3450】【Tyvj1952】Easy 概率DP
这两道题是一样的...... 我就说一下较难的那个 OSU!: 这道15行的水题我竟然做了两节课...... 若是f[i][0]=(1-p)*f[i-1][0]+(1-p)*f[i-1][1],f[i ...
- eclipse中的debug按钮组突然找不到了,找回方法
- sls语法:创建file,创建文件夹
http://blog.kukafei520.net/html/2014/942.html /tmp/aaa.txt: file.managed /tmp/salt_test: file.direct ...
- bzoj 3513 [MUTC2013]idiots FFT 生成函数
[MUTC2013]idiots Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 806 Solved: 265[Submit][Status][Di ...