hihocoder 1138 Islands Travel dijkstra+heap 难度:2
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的更多相关文章
- hihocoder #1138 : Islands Travel
题意,求1到n的最短路.不难想到单源最短路,难点在于数量级太大,因此如何建图是关键: 因为cost = min{|Xi-Xj|, |Yi-Yj|}:所以,点i的移动只有两种情况,. x距离最近的点,. ...
- 【最短路算法】Dijkstra+heap和SPFA的区别
单源最短路问题(SSSP)常用的算法有Dijkstra,Bellman-Ford,这两个算法进行优化,就有了Dijkstra+heap.SPFA(Shortest Path Faster Algori ...
- 【BZOJ-1576】安全路径Travel Dijkstra + 并查集
1576: [Usaco2009 Jan]安全路经Travel Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1044 Solved: 363[Sub ...
- [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 ...
- 【CF20C】Dijkstra?(DIJKSTRA+HEAP)
没什么可以说的 做dijk+heap模板吧 以后考试时候看情况选择SFPA和DIJKSTRA ; ..]of longint; dis:..]of int64; a:..]of int64; b:.. ...
- hihocoder Counting Islands II(并查集)
Counting Islands II 描述 Country H is going to carry out a huge artificial islands project. The projec ...
- Dijkstra+Heap模板
普通Dijkstra: void DijkstraPath(int v0,int vis[],int dist[],int path[]) { int onePath[maxn]; int d; in ...
- Hihocoder #1081 最短路径一 dijkstra
#1081 : 最短路径·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 万圣节的早上,小Hi和小Ho在经历了一个小时的争论后,终于决定了如何度过这样有意义的一天—— ...
- Dijkstra、Dij + heap、Floyd、SPFA、 SPFA + SLF Template
Dijkstra in Adjacency matrix : int Dijkstra(int src,int tec, int n){ ]; ]; memset(done,,sizeof(done) ...
随机推荐
- Linux命令之乐--awk
1.脚本参数传值 #/bin/bash awk '"} {if(($1==a)) print $2;}' /etc/hosts 执行结果:
- CodeForces 185A 快速幂
一开始找矩阵快速幂的题来做时就看到了这题,题意就是让你求出如图所示的第n个三角形中指向向上的小三角形个数.从图中已经很容易看出递推关系了,我们以f[n]表示第n个大三角形中upward的小三角形个数, ...
- 测试分页查询出数据并分文件导出[java工程]
package cn.shiyanjun.test; import java.util.ArrayList; import java.util.List; public class ExcelTest ...
- android中textview设置为多行文本时,如何让文字从最顶开始显示
<span style="white-space:pre"> </span><EditText android:layout_width=" ...
- SwitchCompat 修改颜色
Ok, so I'm sorry but most of these answers are incomplete or have some minor bug in them. The very c ...
- 安卓手机与电脑无线传输文件(利用ftp服务)
安卓手机与电脑无线传输文件(利用ftp服务) 手机与电脑无线传输文件,手机开启ftp服务,电脑能够对手机内全部文件进行全方位管理,包括上传.下载.新建.删除等,而且手机和电脑能够双向传输,很方便.手机 ...
- Selenium解决页面元素不在视野范围内的问题
当需要使用滚动条才能使页面元素显示在视野范围内时,必须用代码处理下,才能对其进行操作. 处理其实也很简单,就是调用JS函数. driver.executeScript("arguments[ ...
- SAP 通过屏幕字段查看透明表
我要查看创建采购订单屏幕上抬头部分付款条件的这个透明表中的字段. 图1. 1.首先准备好MM模块中的常用透明表. 图2. 2.把光标放在字段上,按F1,再点击图中技术信息按钮. 图3. 3.在弹出的技 ...
- CreateDIBSection函数
HBITMAP CreateDIBSection( HDC hdc, // handle to DC CONSTBITMAPINFO*pbmi, // bitmap dataUINT iUsage, ...
- redis.conf详解
# Redis示例配置文件 # 注意单位问题:当需要设置内存大小的时候,可以使用类似1k.5GB.4M这样的常见格式: # # 1k => bytes # 1kb => bytes # 1 ...