做这道题的动机就是想练习一下堆的应用,顺便补一下好久没看的图论算法。

Dijkstra算法概述

//从0出发的单源最短路

dis[][] = {INF}
ReadMap(dis);
for i = 0 -> n - 1
d[i] = dis[0][i]
while u = GetNearest(1 .. n - 1, !been[])
been[u] = 1
for_each edge from u
d[edge.v] = min(d[edge.v], d[u] + dis[u][edge.v])

上述算法遍历所有节点,每次 GetNearest() 循环一次,并遍历了所有边,算法复杂度 O(V2+E) = O(V2)

其中 GetNearest() 总取未去过的点中 d[] 最小的点,可以用小根堆维护 d[] 数组优化。

堆优化算法概述

//从0出发的单源最短路

dis[][] = {INF}
ReadMap(dis);
for i = 0 -> n - 1
d[i] = dis[0][i]
heap = BuildHeap(d[], n - 1)
while u = heap.pop()
been[u] = 1
for_each edge from u
if IsBetterDist()
d[edge.v] = d[u] + dis[u][edge.v]
heap.up(heap.IndexOf(edge.v))

建堆 O(VlogV),n次pop() O(VlogV),遍历边并更新堆 O(ElogV),优化算法复杂度 O(2VlogV+ElogV) = O((V+E)logV)

其他心得

* 几何类最短路一定要判重点

//POJ 2502
//Dijkstra 堆优化试水
//飘忽不定的迷离的数据
//AC 2016-10-17 #define HEAP_OPTIMIZE #include <cstdio>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#define MAXN (200 + 2) + 10
#define SUB_SPEED (40000.0 / 60.0)
#define WALK_SPEED (10000.0 / 60.0)
#define INF 0x7f7f7f7f
using namespace std; inline double sqr(int x){
return x * x;
} struct point {
int x, y;
point(){}
point(int X, int Y): x(X), y(Y){}
inline double norm(){
return sqrt(sqr(x) + sqr(y));
}
friend point operator - (const point &p1, const point &p2){
return point(p1.x - p2.x, p1.y - p2.y);
}
friend bool operator == (const point &p1, const point &p2){
return (p1.x == p2.x) && (p1.y == p2.y);
}
}pt[MAXN]; int n = 0; int IndexOf(const point &p){
for (int i = 0; i < n; i++){
if (pt[i] == p)
return i;
}
return n;
} double dis[MAXN][MAXN], d[MAXN];
bool been[MAXN]; struct BHeap{
int heap[MAXN], n, index[MAXN];
BHeap(): n(0){}
BHeap(int N): n(0){
for (int i = 1; i <= N; i++)
push(i);
}
void down(int i){
for (int j = 2 * i; j <= n; j <<= 1){
j += j < n && d[heap[j]] > d[heap[j + 1]];
if (d[heap[j]] < d[heap[i]]){
swap(index[heap[i]], index[heap[j]]);
swap(heap[i], heap[j]);
i = j;
}
else break;
}
}
void up(int i){
for (int j = i/2; j > 0; j >>= 1){
if (d[heap[j]] > d[heap[i]]){
swap(index[heap[i]], index[heap[j]]);
swap(heap[i], heap[j]);
i = j;
}
else break;
}
}
void push(int a){
heap[++n] = a;
index[a] = n;
up(n);
}
int pop(){
if (!n) return 0;
swap(index[heap[1]], index[heap[n]]);
swap(heap[1], heap[n--]);
down(1);
return heap[n + 1];
}
}heap; int main(){
freopen("fin.c", "r", stdin);
for (int i = 0; i < MAXN; i++)
for(int j = 0; j < MAXN; j++)
if (i == j) dis[i][j]=0;
else dis[i][j] = INF;
scanf("%d%d%d%d", &pt[0].x, &pt[0].y, &(pt[1].x), &pt[1].y);
n = 2;
dis[0][1] = dis[1][0] = (pt[0] - pt[1]).norm() / WALK_SPEED;
point p;
while (~scanf("%d%d", &p.x, &p.y)){
int iter = IndexOf(p), olditer = - 1;
if (iter == n){
pt[n++] = p;
for (int i = 0; i < n; i++){
dis[i][n - 1] = dis[n - 1][i] = (pt[n - 1] - pt[i]).norm() / WALK_SPEED;
}
}
olditer = iter;
while (scanf("%d%d", &p.x, &p.y), ~p.x && ~p.y){
int iter = IndexOf(p);
if (iter == n){
pt[n++] = p;
for (int i = 0; i < n; i++){
if (i != olditer)
dis[i][n - 1] = dis[n - 1][i] = (pt[n - 1] - pt[i]).norm() / WALK_SPEED;
else
dis[i][n - 1] = dis[n - 1][i] = (pt[n - 1] - pt[i]).norm() / SUB_SPEED;
}
}
else dis[olditer][iter] = dis[iter][olditer] = (pt[iter] - pt[olditer]).norm() / SUB_SPEED;
olditer = iter;
}
}
for (int i = 1; i < n; i++)
d[i] = dis[0][i];
#ifdef HEAP_OPTIMIZE
heap = BHeap(n - 1);
#endif
while (
#ifdef HEAP_OPTIMIZE
int v = heap.pop()
#else
1
#endif
){
#ifndef HEAP_OPTIMIZE
double minn = INF;
int v = - 1;
for (int i = 1; i < n; i ++)
if ((!been[i])&&(d[i] < minn)){
minn = d[i];
v = i;
}
if (!~v) break;
#endif
been[v] = 1;
for (int i = 1; i < n; i++){
if (!been[i]){
if (d[v] + dis[v][i] < d[i]){
d[i] = d[v] + dis[v][i];
#ifdef HEAP_OPTIMIZE
heap.up(heap.index[i]);
#endif
}
}
}
}
printf("%.f\n", d[1]);
}

POJ 2502 - Subway Dijkstra堆优化试水的更多相关文章

  1. POJ 2502 Subway (Dijkstra 最短+建设规划)

    Subway Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6689   Accepted: 2176 Descriptio ...

  2. Bzoj 2834: 回家的路 dijkstra,堆优化,分层图,最短路

    2834: 回家的路 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 62  Solved: 38[Submit][Status][Discuss] D ...

  3. POJ2387(dijkstra堆优化)

    Til the Cows Come Home Bessie is out in the field and wants to get back to the barn to get as much s ...

  4. POJ 2502 Subway / NBUT 1440 Subway / SCU 2186 Subway(图论,最短距离)

    POJ 2502 Subway / NBUT 1440 Subway / SCU 2186 Subway(图论,最短距离) Description You have just moved from a ...

  5. hdu 2544 单源最短路问题 dijkstra+堆优化模板

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  6. 深入理解dijkstra+堆优化

    深入理解dijkstra+堆优化 其实就这几种代码几种结构,记住了完全就可以举一反三,所以多记多练多优化多思考. Dijkstra   对于一个有向图或无向图,所有边权为正(边用邻接矩阵的形式给出), ...

  7. dijkstra堆优化(multiset实现->大大减小代码量)

    例题: Time Limit: 1 second Memory Limit: 128 MB [问题描述] 在电视时代,没有多少人观看戏剧表演.Malidinesia古董喜剧演员意识到这一事实,他们想宣 ...

  8. POJ 1511 - Invitation Cards 邻接表 Dijkstra堆优化

    昨天的题太水了,堆优化跑的不爽,今天换了一个题,1000000个点,1000000条边= = 试一试邻接表 写的过程中遇到了一些问题,由于习惯于把数据结构封装在 struct 里,结果 int [10 ...

  9. Dijkstra堆优化学习

    最短路径例题 今天特地学习了Dijkstra的堆优化(主要是慕名已久). 我们需要一个堆来记录[编号,到编号这个点的最短路径值(当然只是当前的)] 与原来的Dijkstra操作基本一致,主要有以下几点 ...

随机推荐

  1. HEX格式数据转换成十六进制字符串

    /** * Hex格式数据转换成十六进制字符串 * @param src */ public void bytesToHexString(byte[] by){ StringBuilder strin ...

  2. ps通道磨皮

    1.Ctrl+J 复制一个新图层2.进入通道面板,复制一个噪点最多的通道3.滤镜--其他--高反差保留 (我一般设数值13)4.图像--计算 (混合模式选择强光) 计算3次,得到Alpha3 5.按住 ...

  3. PHP函数getopt详解

    短参数 它返回一个包含命令行参数的数组.比如,要获得-a -b 和-c的值,可以这么做: $arguments = getopt("a:b:c:"); 可以用下面的方式运行脚本(有 ...

  4. Dictionary<TKey, TValue> 类

    C# Dictionary<TKey, TValue> 类 Dictionary<TKey, TValue> 泛型类提供了从一组键到一组值的映射.字典中的每个添加项都由一个值及 ...

  5. LINUX下动态库及版本号控制

    针对同一动态组件的不同版本链接和加载. 一.概念                  DLL HELL字面意思是DLL"灾难",是由于com组件(动态库)升级引起的程序不能运行的情况 ...

  6. Android开发60条技术经验总结

    Android开发60条技术经验总结,以下是全文: 1. 全部Activity可继承自BaseActivity,便于统一风格与处理公共事件,构建对话框统一构建器的建立,万一需要整体变动,一处修改到处有 ...

  7. Mono addin 学习笔记 3

    典型的基于Mono addin插件框架的应用程序有以下一个部分组成: 1. 主应用程序:提供了一系列的扩展点(Extension Point)供其他应用进行扩展: 2. 扩展插件: 其部署结构图如下为 ...

  8. 【Android 系统开发】Android JNI/NDK (三) 之 JNIEnv 解析

    jni.h文件 : 了解 JNI 需要配合 jni.h 文件, jni.h 是 Google NDK 中的一个文件, 位置是 $/Android-ndk-r9d/platforms/android-1 ...

  9. CSS的相对定位和就对定位

    1.元素的position属性的值默认为static 就是没有定位,元素出现在正常的文档流中,,这个时候你给这个元素设置的left,right,bottom,top这些偏移属性都是没有效果的, 使用相 ...

  10. dp4

    T1.机器分配(machine) 题目大意:把N台机器分给M个公司,每个公司分到不同数量机器有不同利润,求分配的最大利润. N<=100,M<=100 解题思路:一眼题啊.设a[x][y] ...