hdu 4179 Difficult Routes (SP)
坑了我一个晚上的SP题。
题意是,给出若干空间中的点,给出其中某些点之间是有直线线段路径相连的。要求求出一条从s开始到t结束的路径,它的难度是d。难度的计算是空间线段两点的高度差乘以100再除以投影到xOy平面上线段的长度。难度是d的路径的定义是路径中,经过的线段的难度最大是d。
其实比较容易可以想到的是枚举难度最大的线段的,同时构建难度小于等于给定值的正图和反图。正图是用来求出起点s到各个顶点的最短距离,因为是有向图,所以求出t到各个顶点的最短距离是要用到反图来求的。然后就将两条路径拼接到被枚举的线段上。
中间错的好多的是,写之前还想到要用反图求t到各个顶点的最短距离,结果写的时候就忘记了,最后多得队友ly的提醒!然后就是比较SB的一个行为了。明明就是直接拼接上去就好了,结果我想太多,没有考虑到我的图是有向图,搞多了两个比较,于是就狠狠的被坑了一个晚上了!!!_(:з」∠)_
代码如下:
#include <cstdio>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <cstring> using namespace std; const int N = ;
const int M = ;
int eh[][N], ec[];
struct Edge {
int id, nx, df;
double l;
Edge() {}
Edge(int id, int nx, int df, double l) : id(id), nx(nx), df(df), l(l) {}
} edge[][M << ]; inline void init() {
memset(eh, -, sizeof(eh));
memset(ec, , sizeof(ec));
} inline void addedge(int u, int v, int df, double l, int id) {
edge[id][ec[id]] = Edge(v, eh[id][u], df, l);
eh[id][u] = ec[id]++;
} int x[N], y[N], z[N];
template<class T> inline T sqr(T a) { return a * a;}
int st[M << ], ed[M << ]; inline int getdf(int a, int b) {
if (z[a] >= z[b]) return ;
double len = sqrt(sqr((double) x[a] - x[b]) + sqr((double) y[a] - y[b]));
return (int) floor(100.0 * (z[b] - z[a]) / len);
} inline double getdis(int a , int b) { return sqrt(sqr((double) x[a] - x[b]) + sqr((double) y[a] - y[b]) + sqr((double) z[a] - z[b]));}
const double FINF = 1e50;
double dis[][N];
int q[M << ];
bool vis[N]; void spfa(int s, int id) {
for (int i = ; i < N; i++) dis[id][i] = FINF;
int qh, qt;
qh = qt = ;
dis[id][s] = ;
q[qt++] = s;
vis[s] = true;
while (qh < qt) {
int cur = q[qh++];
vis[cur] = false;
for (int i = eh[id][cur]; ~i; i = edge[id][i].nx) {
if (dis[id][edge[id][i].id] > dis[id][cur] + edge[id][i].l) {
dis[id][edge[id][i].id] = dis[id][cur] + edge[id][i].l;
if (!vis[edge[id][i].id]) q[qt++] = edge[id][i].id, vis[edge[id][i].id] = true;
}
}
}
} int main() {
// freopen("in", "r", stdin);
int n, m;
while (~scanf("%d%d", &n, &m) && (n || m)) {
for (int i = ; i <= n; i++) scanf("%d%d%d", &x[i], &y[i], &z[i]);
for (int i = ; i < m; i++) scanf("%d%d", &st[i], &ed[i]);
int A, B, D;
scanf("%d%d%d", &A, &B, &D);
init();
for (int i = ; i < m; i++) {
double tmp = getdis(st[i], ed[i]);
int df = getdf(st[i], ed[i]);
if (df <= D) {
addedge(st[i], ed[i], df, tmp, );
addedge(ed[i], st[i], df, tmp, );
}
df = getdf(ed[i], st[i]);
if (df <= D) {
addedge(ed[i], st[i], df, tmp, );
addedge(st[i], ed[i], df, tmp, );
}
}
spfa(A, );
spfa(B, );
// for (int i = 1; i <= n; i++) cout << dis[0][i] << ' '; cout << endl;
// for (int i = 1; i <= n; i++) cout << dis[1][i] << ' '; cout << endl;
double ans = FINF;
for (int i = ; i <= n; i++) {
for (int t = eh[][i]; ~t; t = edge[][t].nx) {
if (edge[][t].df == D) ans = min(ans, dis[][i] + edge[][t].l + dis[][edge[][t].id]);
}
}
if (ans < FINF) printf("%.1f\n", ans);
else puts("None");
}
return ;
}
再搞搞几何就得开图论来练了!不然对于这种SB题目都毫无自己做错的意识,相当蛋疼的感觉。。_(:з」∠)_
——written by Lyon
hdu 4179 Difficult Routes (SP)的更多相关文章
- hdu 5552 Bus Routes
hdu 5552 Bus Routes 考虑有环的图不方便,可以考虑无环连通图的数量,然后用连通图的数量减去就好了. 无环连通图的个数就是树的个数,又 prufer 序我们知道是 $ n^{n-2} ...
- HDU 5552 Bus Routes(NTT+分治)
题意 给定 \(n\) 个点,任意连边,每条边有 \(m\) 种颜色可选,求带环连通图的方案数. \(1\leq n\leq 10000\) \(1\leq m < 2^{31}\) 思路 直接 ...
- HDU 5552 Bus Routes(2015合肥现场赛A,计数,分治NTT)
题意 给定n个点,任意两点之间可以不连边也可以连边.如果连边的话可以染上m种颜色. 求最后形成的图,是一个带环连通图的方案数. 首先答案是n个点的图减去n个点能形成的树. n个点能形成的树的方案数比 ...
- hdu 4063 Aircraft (Geometry + SP)
Problem - 4063 几何加简单最短路. 题意是给出若干圆的圆心以及半径,求出从给出的起点到终点的最短路径的长度,可以移动的区域是圆覆盖到的任意一个位置. 做法是这样的,对圆两两求交点,用这些 ...
- 【转】最短路&差分约束题集
转自:http://blog.csdn.net/shahdza/article/details/7779273 最短路 [HDU] 1548 A strange lift基础最短路(或bfs)★254 ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
- hdu图论题目分类
=============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...
- HDU图论题单
=============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...
- 【HDOJ图论题集】【转】
=============================以下是最小生成树+并查集====================================== [HDU] How Many Table ...
随机推荐
- 洛谷P2912 [USACO08OCT]牧场散步Pasture Walking [2017年7月计划 树上问题 01]
P2912 [USACO08OCT]牧场散步Pasture Walking 题目描述 The N cows (2 <= N <= 1,000) conveniently numbered ...
- JavaScript 中的多线程通信的方法
在Html 5诞生之后,我们可以使用javascript来实现多线程处理.H5 新增了一个web workers api,使用这个API,用户可以很容易地创建在后台运行的线程,H5 中被称为workd ...
- 2019阿里云开年Hi购季云通信分会场全攻略!
2019阿里云云上Hi购季活动已经于2月25日正式开启,从已开放的活动页面来看,活动分为三个阶段: 2月25日-3月04日的活动报名阶段.3月04日-3月16日的新购满返+5折抢购阶段.3月16日-3 ...
- 洛谷3953 (NOIp2017) 逛公园——记忆化搜索+用栈判0环
题目:https://www.luogu.org/problemnew/show/P3953 因为K只有50,所以想到用dp[ cr ][ j ]表示在点cr.比最短路多走了 j 的方案数.(看了TJ ...
- HDU 2639 第K大背包问题
//状态方程和01背包类似,dp[j][k]表示背包容量为j的第k大背包的值.......... //应当注意的是此时dp[j][1.....k]应当是递减的.................... ...
- 对C语言内存对齐的初步了解
在解释内存对齐的作用前,先来看下内存对齐的规则: 1. 对于结构的各个成员,第一个成员位于偏移为0的位置,以后每个数据成员的偏移量必须是min(#pragma pack()指定的数,这个数据成员的自身 ...
- python实现六大分群质量评估指标(兰德系数、互信息、轮廓系数)
python实现六大分群质量评估指标(兰德系数.互信息.轮廓系数) 1 R语言中的分群质量--轮廓系数 因为先前惯用R语言,那么来看看R语言中的分群质量评估,节选自笔记︱多种常见聚类模型以及分群质量评 ...
- python ndarray相关操作:转置、翻转
- Python 使用正则表达式抽取数据
- java memory allocation(转)
Java的运行时数据存储机制 Java程序在运行时需要为一系列的值或者对象分配内存,这些值都存在什么地方?用什么样的数据结构存储?这些数据结构有什么特点?本文试图说明此命题的皮毛之皮毛. 概念 对 ...