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. python 数据库风格的DataFrame合并

  2. 禁用/移除WordPress页面的评论功能

    对于某些类型的WordPress站点,也许不需要在页面(page)提供评论功能,那么你可以通过下面的方法,很容易就禁用或移除WordPress页面的评论功能. 方法1:在页面编辑界面取消该页面的评论功 ...

  3. 获取电脑名和Ip

    private string  GetHostNameAndIP( bool  isv4Orv6)        {            string HostName = Dns.GetHostN ...

  4. JavaScript 报错 注释

  5. vim中NERDTREE插件的使用

    一个显示目录树的插件,很不错 学习于: http://blog.csdn.net/xiongzhengxiang/article/details/7375607

  6. GDSOI2017第三轮模拟4.21 总结

    1 第一题看着就觉得猎奇,于是就想着打暴力就跑. 但是很严重的问题就是... \(D\)和\(B\)打反了,都不知道当时在干什么??? 原本可以拿35. 2 第二题看着就觉得套路,于是想着今天就攻这题 ...

  7. ie8或9下ajax跨域问题

    ie8或9下ajax跨域支持,添加如下代码 <!--[if (IE 8)|(IE 9)]><script src="https://cdn.bootcss.com/jque ...

  8. SDUT-3379_数据结构实验之查找七:线性之哈希表

    数据结构实验之查找七:线性之哈希表 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 根据给定的一系列整数关键字和素数p, ...

  9. 洛谷P1063 能量项链 [2006NOIP提高组]

    P1063 能量项链 题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标 记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子 ...

  10. PHP学习(类型转化)

    PHP 在变量定义中不需要(或不支持)明确的类型定义:变量类型是根据使用该变量的上下文所决定的.也就是说,如果把一个 string 值赋给变量 $var , $var 就成了一个 string .如果 ...