http://hihocoder.com/problemset/problem/1138

很久不用最短路,几乎连基本性质也忘了,结果这道题就是某些最短路算法空间复杂度是o(n)

这里总结四种算法

算法名称           时间复杂度       空间复杂度

dijkstra+heap  O(elog(e+n))   O(n)

bellman-ford    O(ne)             O(n)

spfa                O(ke)             O(n)

floyd-warshall   O(n^3)          O(n^2)

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<queue> using namespace std;
const int maxn = 1e5 + 5;
const int maxm = 1e6 + 6; int first[maxn],n;
struct edge
{
int t,c,nxt;
} e[maxm]; void addedge(int f,int t,int c,int ind)
{
e[ind].nxt = first[f];
e[ind].t = t;
e[ind].c = c;
first[f] = ind;
} struct pnt
{
int x,y,id;
pnt()
{
x = y = id = 0;
}
pnt(int _x,int _y,int _id)
{
x = _x;
y = _y;
id = _id;
}
};
bool cmpx(pnt p1,pnt p2)
{
if(p1.x!= p2.x)return p1.x < p2.x;
return p1.y < p2.y;
}
bool cmpy(pnt p1,pnt p2)
{
if(p1.y!= p2.y)return p1.y < p2.y;
return p1.x < p2.x;
}
pnt a[maxn];
long long dis[maxn];
bool vis[maxn];
typedef pair<long long ,int> P;
priority_queue<P, vector <P>, greater<P> > que;
long long dijkstra()
{
for(int i = 0; i < n; i++)dis[i] = 2e18;
memset(vis,false,sizeof vis);
while(!que.empty())que.pop(); dis[0] = 0;
vis[0] = true;
for(int p = first[0]; p != -1; p = e[p].nxt)
{
int t = e[p].t;
dis[t] = e[p].c;
que.push(P(dis[t],t));
} while(!que.empty())
{
int f = que.top().second;
que.pop();
if(f == n-1)break;
if(vis[f])continue;
vis[f] = true; for(int p = first[f]; p != -1; p = e[p].nxt)
{
int t = e[p].t;
if(dis[t] > dis[f] + e[p].c){
dis[t] = dis[f] + e[p].c;
que.push(P(dis[t],t));
}
}
} return dis[n - 1];
}
int main()
{
while(scanf("%d",&n)==1)
{
memset(first, -1, sizeof first);
for(int i = 0; i < n; i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
a[i].id = i;
} sort(a,a + n,cmpx);
for(int i = 0; i < n - 1; i++)
{
addedge(a[i].id,a[i + 1].id,
min(abs(a[i].x - a[i + 1].x),abs(a[i].y - a[i + 1].y)),2 * i);
addedge(a[i + 1].id,a[i].id,
min(abs(a[i].x - a[i + 1].x),abs(a[i].y - a[i + 1].y)),2 * i + 1);
}
sort(a,a + n,cmpy);
for(int i = 0; i < n - 1; i++)
{
addedge(a[i].id,a[i + 1].id,
min(abs(a[i].x - a[i + 1].x),abs(a[i].y - a[i + 1].y)),2 * i + 2 * n);
addedge(a[i + 1].id,a[i].id,
min(abs(a[i].x - a[i + 1].x),abs(a[i].y - a[i + 1].y)),2 * i + 1 + 2 * n);
} long long ans = dijkstra();
printf("%lld\n",ans);
}
return 0;
}

hihocoder 1138 Islands Travel dijkstra+heap 难度:2的更多相关文章

  1. hihocoder #1138 : Islands Travel

    题意,求1到n的最短路.不难想到单源最短路,难点在于数量级太大,因此如何建图是关键: 因为cost = min{|Xi-Xj|, |Yi-Yj|}:所以,点i的移动只有两种情况,. x距离最近的点,. ...

  2. 【最短路算法】Dijkstra+heap和SPFA的区别

    单源最短路问题(SSSP)常用的算法有Dijkstra,Bellman-Ford,这两个算法进行优化,就有了Dijkstra+heap.SPFA(Shortest Path Faster Algori ...

  3. 【BZOJ-1576】安全路径Travel Dijkstra + 并查集

    1576: [Usaco2009 Jan]安全路经Travel Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1044  Solved: 363[Sub ...

  4. [dijkstra+heap优化] 模板

    var n,m,s,i,j,x,y,z,l,tot :longint; pre,last,other,len :..] of longint; heap,d,pl :Array[..] of long ...

  5. 【CF20C】Dijkstra?(DIJKSTRA+HEAP)

    没什么可以说的 做dijk+heap模板吧 以后考试时候看情况选择SFPA和DIJKSTRA ; ..]of longint; dis:..]of int64; a:..]of int64; b:.. ...

  6. hihocoder Counting Islands II(并查集)

    Counting Islands II 描述 Country H is going to carry out a huge artificial islands project. The projec ...

  7. Dijkstra+Heap模板

    普通Dijkstra: void DijkstraPath(int v0,int vis[],int dist[],int path[]) { int onePath[maxn]; int d; in ...

  8. Hihocoder #1081 最短路径一 dijkstra

    #1081 : 最短路径·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 万圣节的早上,小Hi和小Ho在经历了一个小时的争论后,终于决定了如何度过这样有意义的一天—— ...

  9. Dijkstra、Dij + heap、Floyd、SPFA、 SPFA + SLF Template

    Dijkstra in Adjacency matrix : int Dijkstra(int src,int tec, int n){ ]; ]; memset(done,,sizeof(done) ...

随机推荐

  1. JavaSE复习_6 枚举类

    △单例类是指只有一个实例,而枚举类实际上就是有有限个实例的类,在类里已经把实例定义好了. △枚举类的三种创建形式: 1) enum Week { MON,TUE,WED;//枚举类有默认构造函数创建的 ...

  2. D3.js 弦图的制作

    这是一种用于描述节点之间联系的图表. 1. 弦图是什么 弦图(Chord),主要用于表示两个节点之间的联系. 两点之间的连线,表示谁和谁具有联系: 线的粗细表示权重: 2. 数据 初始数据为: var ...

  3. eclipse里maven install时,报错提示jdk为无效的目标版本:1.7

    http://blog.csdn.net/wabiaozia/article/details/51733372 ************************************ 报错提示: [ ...

  4. CTEX里的函数、符号及特殊字符

    CTEX里的函数.符号及特殊字符 声调 语法 效果 语法 效果 语法 效果 \bar{a}   \acute{a}   \check{a}   \grave{a}   \tilde{a}   \hat ...

  5. 在linux上搭建本地yum源

    准备yum仓库的光盘镜像IOS文件: 设置光驱加载本地磁盘的yum仓库的光盘镜像文件: 在linux的命令行输入setup命令打开设置窗口,选择"System Service": ...

  6. 转!!Java学习之自动装箱和自动拆箱源码分析

    自动装箱(boxing)和自动拆箱(unboxing)   首先了解下Java的四类八种基本数据类型   基本类型 占用空间(Byte) 表示范围 包装器类型 boolean 1/8 true|fal ...

  7. Python策略模式实现源码分享

    1.让一个对象的某个方法可以随时改变,而不用更改对象的代码 2.对于动态类型的Python语言,不需要定义接口 3.基本的实现方法:用类作为参数传递 例如: 12_eg3.py class Movea ...

  8. 【BZOJ 3295】动态逆序对 - 分块+树状数组

    题目描述 给定一个1~n的序列,然后m次删除元素,每次删除之前询问逆序对的个数. 分析:分块+树状数组 (PS:本题的CDQ分治解法见下一篇) 首先将序列分成T块,每一块开一个树状数组,并且先把最初的 ...

  9. Qt之QSS(QDarkStyleSheet)

    简述 关于样式,前面介绍了很多内容,下面分享一个深色样式表,很值得借鉴! 简述 效果 QSS 更多参考 效果 QSS /* * The MIT License (MIT) * * Copyright ...

  10. 198. 213. 337. House Robber -- 不取相邻值的最大值

    198. House Robber You are a professional robber planning to rob houses along a street. Each house ha ...