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 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以起始 ...
随机推荐
- 【工作感悟】——xyb项目部署
[前言] 接手xyb项目维护有一段时间了,除了熟悉业务需求和开发环境外,还没有进行新需求的开发.前几天突然接到一个任务,要去发改委给他们部署一版最新的系统.本来事情也不大,也没有很难.但是本来是大屈. ...
- 【工作感悟】——揭开“PM”的面纱
[前言] 上次跟大家分享了面试的故事,小编觉得效果还不错,因此小编决定把工作感悟系列写下去,不过时间就不好说了.希望小伙伴们在评论列表中发表自己的看法和观点,积极参与啦~~ [背景] 初来Y公司,作为 ...
- jetty-maven-plugin
<plugins> <plugin> <groupId>org.eclipse.jetty</groupId> <artifact ...
- 【历史】- .NET之父 - Anders Hejlsberg
简介 安德斯·海尔斯伯格(Anders Hejlsberg,1960.12~),丹麦人,Turbo Pascal编译器的主要作者,Delphi和.NET之父! 安德斯·海尔斯伯格曾在丹麦技术大学学习工 ...
- 【题解】Bzoj4316小C的独立集
决定要开始学习圆方树 & 仙人掌相关姿势.加油~~ 其实感觉仙人掌本质上还是一棵树,长得也还挺优美的.很多的想法都可以往树的方面上靠,再针对仙人掌的特性做出改进.这题首先如果是在树上的话那么实 ...
- [Leetcode] Wildcard matching 通配符匹配
Implement wildcard pattern matching with support for'?'and'*'. '?' Matches any single character. '*' ...
- fail2ban软件 +ssh密钥登录
fail2ban可以监视你的系统日志,然后匹配日志的错误信息(正则式匹配)执行相应的屏蔽动作(一般情况下是调用防火墙屏蔽),如:当有人在试探你的SSH.SMTP.FTP密码,只要达到你预设的次数,fa ...
- spring中@PropertySource注解的使用
概述: The @PropertySource annotation provides a convenient and declarative mechanism for adding aPrope ...
- vm虚拟机 开启时报错 无法打开内核设备“\\.\Global\vmx86”: 系统找不到指定的文件。
解决办法 方案一 1/http://jingyan.baidu.com/article/455a9950aaf4aea167277878.html 方案二 2.http://jingyan.baidu ...
- 我们用CloudStack做什么
原文地址:http://www.sdfengxi.com/?p=376 我想很多同学会有类似的疑问,就是我配置好了CloudStack或者OpenStack之类的环境之后能够提供什么服务或者应用呢?下 ...