hdu4179 限制最短路
题意:
这个题目估计读懂题意就ok了,关键是题意蛋疼,像我这样的英语渣渣活着可真难啊,题意大体是这样,给你n个点m条无向边,给你起点和终点,让你求从起点到终点的最短路径,其中有一些限制:
(1) 所有的边的d必须小于等于题目给的D
(2) 必须至少有一条边的d 等于题目给的 D
下面说一下d的求法,对于每条边ab,如果a.z >= b.z也就是下坡,d = 0,否则d等于高度变化的绝对值*100 除以 线段在xoy面上的投影线段的长度,最后向下取证(不用考虑竖直上下的情况)。
思路:
题意懂了这个题目就好做了,直接判断建图,建两个图,一个是正向的一个是反向的,然后跑两边最短路,然后在枚举每一条d == D 的边取得最优的就行了。
#include<stdio.h>
#include<string.h>
#include<queue>
#include<math.h> #define N_node 11111
#define N_edge 55555
#define INF 1000000000
using namespace std; typedef struct
{
int to ,next;
double cost;
}STAR; typedef struct
{
int a ,b;
}EDGE; typedef struct
{
double x ,y ,z;
}NODE; STAR E1[N_edge] ,E2[N_edge];
EDGE edge[N_edge] ,ee[N_edge];
NODE node[N_node];
int list1[N_node] ,list2[N_node] ,tot;
double dis1[N_node] ,dis2[N_node]; void add(int a ,int b ,double c)
{
E1[++tot].to = b;
E1[tot].cost = c;
E1[tot].next = list1[a];
list1[a] = tot;
E2[tot].to = a;
E2[tot].cost = c;
E2[tot].next = list2[b];
list2[b] = tot;
} double get_dis(NODE a ,NODE b)
{
double x = (a.x - b.x) * (a.x - b.x);
double y = (a.y - b.y) * (a.y - b.y);
double z = (a.z - b.z) * (a.z - b.z);
return sqrt(x + y + z);
} int get_d(NODE a ,NODE b)
{
if(a.z >= b.z) return 0;
double x = (a.x - b.x) * (a.x - b.x);
double y = (a.y - b.y) * (a.y - b.y);
double z = b.z - a.z;
return int(z * 100 / sqrt(x + y));
} void spfa(int s ,int n ,int list[] ,double s_x[] ,STAR E[])
{
int mark[N_node] = {0};
for(int i = 0 ;i <= n ;i ++) s_x[i] = INF;
s_x[s] = 0 ,mark[s] = 1;
queue<int>q;
q.push(s);
while(!q.empty())
{
int xin ,tou;
tou = q.front();
q.pop();
mark[tou] = 0;
for(int k = list[tou] ;k ;k = E[k].next)
{
xin = E[k].to;
if(s_x[xin] > s_x[tou] + E[k].cost)
{
s_x[xin] = s_x[tou] + E[k].cost;
if(!mark[xin])
{
mark[xin] = 1;
q.push(xin);
}
}
}
}
} int main ()
{
int n ,m ,i ,s ,t ,d ,a ,b;
while(~scanf("%d %d" ,&n ,&m) && n + m)
{
for(i = 1 ;i <= n ;i ++)
scanf("%lf %lf %lf" ,&node[i].x ,&node[i].y ,&node[i].z);
for(i = 1 ;i <= m ;i ++)
scanf("%d %d" ,&ee[i].a ,&ee[i].b);
scanf("%d %d %d" ,&s ,&t ,&d);
memset(list1 ,0 ,sizeof(list1));
memset(list2 ,0 ,sizeof(list2)) ,tot = 1;
int edge_t = 0;
for(i = 1 ;i <= m ;i ++)
{
a = ee[i].a ,b = ee[i].b;
int d1 = get_d(node[a] ,node[b]);
int d2 = get_d(node[b] ,node[a]);
double dis = get_dis(node[a] ,node[b]);
if(d1 <= d) add(a ,b ,dis);
if(d2 <= d) add(b ,a ,dis);
if(d1 == d)
{
edge[++edge_t].a = a;
edge[edge_t].b = b;
}
if(d2 == d)
{
edge[++edge_t].a = b;
edge[edge_t].b = a;
}
} spfa(s ,n ,list1 ,dis1 ,E1);
spfa(t ,n ,list2 ,dis2 ,E2); double ans = INF;
for(i = 1 ;i <= edge_t ;i ++)
{
double now = dis1[edge[i].a] + get_dis(node[edge[i].a] ,node[edge[i].b]) + dis2[edge[i].b];
if(ans > now) ans = now;
}
ans == INF ? puts("None") : printf("%.1lf\n" ,ans);
}
return 0;
}
hdu4179 限制最短路的更多相关文章
- 最短路&查分约束
[HDU] 1548 A strange lift 根蒂根基最短路(或bfs)★ 2544 最短路 根蒂根基最短路★ 3790 最短路径题目 根蒂根基最短路★ 2066 一小我的观光 根蒂根基最短路( ...
- bzoj1001--最大流转最短路
http://www.lydsy.com/JudgeOnline/problem.php?id=1001 思路:这应该算是经典的最大流求最小割吧.不过题目中n,m<=1000,用最大流会TLE, ...
- 【USACO 3.2】Sweet Butter(最短路)
题意 一个联通图里给定若干个点,求他们到某点距离之和的最小值. 题解 枚举到的某点,然后优先队列优化的dijkstra求最短路,把给定的点到其的最短路加起来,更新最小值.复杂度是\(O(NElogE) ...
- Sicily 1031: Campus (最短路)
这是一道典型的最短路问题,直接用Dijkstra算法便可求解,主要是需要考虑输入的点是不是在已给出的地图中,具体看代码 #include<bits/stdc++.h> #define MA ...
- 最短路(Floyd)
关于最短的先记下了 Floyd算法: 1.比较精简准确的关于Floyd思想的表达:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B.所以,我们假设maz ...
- bzoj1266最短路+最小割
本来写了spfa wa了 看到网上有人写Floyd过了 表示不开心 ̄へ ̄ 改成Floyd试试... 还是wa ヾ(。`Д´。)原来是建图错了(样例怎么过的) 结果T了 于是把Floyd改回spfa 还 ...
- HDU2433 BFS最短路
Travel Time Limit: 10000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- 最短路(代码来源于kuangbin和百度)
最短路 最短路有多种算法,常见的有一下几种:Dijstra.Floyd.Bellman-Ford,其中Dijstra和Bellman-Ford还有优化:Dijstra可以用优先队列(或者堆)优化,Be ...
- Javascript优化细节:短路表达式
什么是短路表达式? 短路表达式:作为"&&"和"||"操作符的操作数表达式,这些表达式在进行求值时,只要最终的结果已经可以确定是真或假,求值过程 ...
随机推荐
- Win命令行切换Python版本
目录 安装2.x 和 3.x 的python 设置系统环境变量 pip的使用 参考 安装2.x 和 3.x 的python 我这里使用anaconda来安装两个版本的python包. conda cr ...
- 手把手教你Spring Boot2.x整合Elasticsearch(ES)
文末会附上完整的代码包供大家下载参考,码字不易,如果对你有帮助请给个点赞和关注,谢谢! 如果只是想看java对于Elasticsearch的操作可以直接看第四大点 一.docker部署Elastics ...
- Thinkphp3分析与审计
0x00 前言: 这篇是去年组内分享的时候给小伙伴写的0基础快速审计tp3系列的文章,主要是对架构做个分析以及审计一些sql注入漏洞~ 现在想想打算放出来,过了一年了,可能里面有一些问题,望看到的大佬 ...
- Node.js 模块化你所需要知道的事
一.前言 我们知道,Node.js是基于CommonJS规范进行模块化管理的,模块化是面对复杂的业务场景不可或缺的工具,或许你经常使用它,但却从没有系统的了解过,所以今天我们来聊一聊Node.js模块 ...
- ElasticSearch入门篇(保姆级教程)
本章将介绍:ElasticSearch的作用,搭建elasticsearch的环境(Windows/Linux),ElasticSearch集群的搭建,可视化客户端插件elasticsearch-he ...
- struct2中package的参数解析
struct2框架的核心组件是action和拦截器,它使用包来管理action和拦截器,每个包就是多个action.多个拦截器引用的集合.在struct.xml中,package元素用于定义包的配置, ...
- C语言float和double输入问题
统计给定的n个数中,负数.零和正数的个数. Input 输入数据有多组,每组占一行,每行的第一个数是整数n(n<100),表示需要统计的数值的个数,然后是n个实数:如果n=0,则表示输入结 ...
- jQuery学习笔记(2) jQuery选择器
jQuery的选择器完全继承了CSS的风格,利用jQuery选择器,可以非常便捷和快速地找出特定的DOM元素,然后为它们添加相应的行为. 目录 目录 CSS选择器 jQuery选择器 jQuery选 ...
- D8016 “/ZI”和“/Gy-”命令行选项不兼容
老版本vs项目升级到vs2017后遇到编译报错: /ZI选项在: /Gy- 选项在: 修改'/ZI'选项为'无' 或者 '/Gy-' 修改为'/Gy'
- 攻防世界 reverse EASYHOOK
EASYHOOK XCTF 4th-WHCTF-2017 1 data=[ 0x61, 0x6A, 0x79, 0x67, 0x6B, 0x46, 0x6D, 0x2E, 0x7F, 0x5F, 2 ...