Problem - 4179

  坑了我一个晚上的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)的更多相关文章

  1. hdu 5552 Bus Routes

    hdu 5552 Bus Routes 考虑有环的图不方便,可以考虑无环连通图的数量,然后用连通图的数量减去就好了. 无环连通图的个数就是树的个数,又 prufer 序我们知道是 $ n^{n-2} ...

  2. HDU 5552 Bus Routes(NTT+分治)

    题意 给定 \(n\) 个点,任意连边,每条边有 \(m\) 种颜色可选,求带环连通图的方案数. \(1\leq n\leq 10000\) \(1\leq m < 2^{31}\) 思路 直接 ...

  3. HDU 5552 Bus Routes(2015合肥现场赛A,计数,分治NTT)

    题意  给定n个点,任意两点之间可以不连边也可以连边.如果连边的话可以染上m种颜色. 求最后形成的图,是一个带环连通图的方案数. 首先答案是n个点的图减去n个点能形成的树. n个点能形成的树的方案数比 ...

  4. hdu 4063 Aircraft (Geometry + SP)

    Problem - 4063 几何加简单最短路. 题意是给出若干圆的圆心以及半径,求出从给出的起点到终点的最短路径的长度,可以移动的区域是圆覆盖到的任意一个位置. 做法是这样的,对圆两两求交点,用这些 ...

  5. 【转】最短路&差分约束题集

    转自:http://blog.csdn.net/shahdza/article/details/7779273 最短路 [HDU] 1548 A strange lift基础最短路(或bfs)★254 ...

  6. 【转载】图论 500题——主要为hdu/poj/zoj

    转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  7. hdu图论题目分类

    =============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...

  8. HDU图论题单

    =============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...

  9. 【HDOJ图论题集】【转】

    =============================以下是最小生成树+并查集====================================== [HDU] How Many Table ...

随机推荐

  1. Anngular.js的大致了解

    只要出发事件 这个事件会刷新DOM节点,去重新渲染DOM节点(把dom擦掉重新画) 浪费内存 浪费效率所以使用Angular.js -懒查找 不涉及渲染 效率最高 展现效率 比原声使用两个事件互相监听 ...

  2. python实例 字符串

    比起C/C++,Python处理字符串的方式实在太让人感动了.把字符串当列表来用吧. #! /usr/bin/python word="abcdefg" a=word[2] pri ...

  3. 【CodeVS】1083 Cantor表

    1083 Cantor表 1999年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题目描述 Description 现代数学的著名证明之 ...

  4. 【P3056】【USACO12NOV】笨牛Clumsy Cows

    P3056 [USACO12NOV]笨牛Clumsy Cows 题目描述 Bessie the cow is trying to type a balanced string of parenthes ...

  5. golang在import自己的包报错问题

    原因:使用git clone项目后,项目根路径是小写英文名称,比如cmdbapi,但是项目里面的import导入自己的相关包时,红色报错 解决:把项目名称改写成import导入包的名称,即cmdbAp ...

  6. 洛谷1081 (NOIp2012) 开车旅行——倍增预处理

    题目:https://www.luogu.org/problemnew/show/P1081 预处理从每个点开始a能走多少.b能走多少.可以像dp一样从后往前推. 但有X的限制.所以该数组可以变成倍增 ...

  7. js实现自由落体

    实现自由落体运动需要理解的几个简单属性: clientHeight:浏览器客户端整体高度 offsetHeight:对象(比如div)的高度 offsetTop:对象离客户端最顶端的距离 <!d ...

  8. IDEA 创建文件夹总默认根节点问题解决

    上面是文件夹结构显示,如果勾掉,就是按层级显示,空目录不会自动折叠成一行 原文地址;https://blog.csdn.net/huangjunwei6/article/details/7150755 ...

  9. 如何解决IntelliJ在打包Maven项目时不打包配置文件

    在pom文件中加上你的配置文件夹目录: <build> <resources> <resource> <directory>src/res</di ...

  10. Markdown Linux

    如何在Linux下使用Markdown进行文档工作 学习于: http://www.ituring.com.cn/article/10044 Markdown 官网: http://daringfir ...