题意,求1到n的最短路。不难想到单源最短路,难点在于数量级太大,因此如何建图是关键;

因为cost =  min{|Xi-Xj|, |Yi-Yj|};所以,点i的移动只有两种情况,. x距离最近的点,. y距离最近的点 

如此一来,每个点i的最多只有四条边(为什么是四条?),这样复杂度就降下来了,单源最短路的复杂度为n*m(点*边数) 

我用spfa。 

解题思路: 

x轴排序,建图 

y轴排序,建图 

求最短路 

用spfa注意队列que的大小至少是n*m,可以使用循环队列 

#include <cstdio>
#include <cstring>
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std; const int N = ; struct node
{
int v;
int i;
bool operator < (const node &t)const
{
return v < t.v;
}
}x[N],y[N]; vector<int>g[N];
int p[N][]; int ABS(int x)
{
return x >= ? x : -x;
} long long get_value(int i,int j)
{
return min(ABS(p[i][]-p[j][]),ABS(p[i][]-p[j][]));
} bool flag[N];
long long dist[N];
int que[N]; long long spfa(int s,int n)
{ memset(flag,false,sizeof(flag));
memset(dist,0x7f,sizeof(dist));
int head = ,tail = ;
dist[s] = ;
flag[s] = true;
que[tail++] = s;
while(head != tail)
{
int tep = que[head++];
if(head >= N) head = ;//循环队列 flag[tep] = false;
for(int i = ; i < g[tep].size(); i++)
{
int v = g[tep][i];
if(dist[v] > dist[tep] + get_value(v,tep))
{
dist[v] = dist[tep] + get_value(v,tep);
if(!flag[v])
{
que[tail++] = v;
if(tail >= N) tail = ;//循环队列 flag[v] = true;
}
}
}
}
return dist[n-]; } int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i = ; i < N; i++) g[i].clear();
for(int i = ; i < n; i++)
{ scanf("%d %d",&p[i][],&p[i][]);
x[i].v = p[i][]; x[i].i = i;
y[i].v = p[i][]; y[i].i = i;
}
sort(x,x+n);
sort(y,y+n);
for(int i = ; i < n; i++)
{
int u = x[i-].i;
int v = x[i].i;
//这里可以去下重
g[u].push_back(v);
g[v].push_back(u);
}
for(int i = ; i < n; i++)
{
int u = y[i-].i;
int v = y[i].i;
//这里可以去下重
g[u].push_back(v);
g[v].push_back(u);
}
printf("%lld\n",spfa(,n));
}
return ;
}

hihocoder #1138 : Islands Travel的更多相关文章

  1. hihocoder 1138 Islands Travel dijkstra+heap 难度:2

    http://hihocoder.com/problemset/problem/1138 很久不用最短路,几乎连基本性质也忘了,结果这道题就是某些最短路算法空间复杂度是o(n) 这里总结四种算法 算法 ...

  2. hihocoder Counting Islands II(并查集)

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

  3. 微软2016校园招聘在线笔试 [Recruitment]

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 A company plans to recruit some new employees. There are N ca ...

  4. hihoCoder 1578 Visiting Peking University 【贪心】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)

    #1578 : Visiting Peking University 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 Ming is going to travel for ...

  5. USACO环绕岛屿Surround the Islands 并查集 枚举暴力

    题目描述 Farmer John has bought property in the Caribbean and is going to try to raise dairy cows on a b ...

  6. [LeetCode] Number of Islands II 岛屿的数量之二

    A 2d grid map of m rows and n columns is initially filled with water. We may perform an addLand oper ...

  7. [LeetCode] Number of Islands 岛屿的数量

    Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surro ...

  8. hihocoder -1121-二分图的判定

    hihocoder -1121-二分图的判定 1121 : 二分图一•二分图判定 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 大家好,我是小Hi和小Ho的小伙伴Net ...

  9. Hihocoder 太阁最新面经算法竞赛18

    Hihocoder 太阁最新面经算法竞赛18 source: https://hihocoder.com/contest/hihointerview27/problems 题目1 : Big Plus ...

随机推荐

  1. php会话技术之Session用法

    php会话技术之Session用法举例. 本文原始链接:http://www.jbxue.com/article/8940.html1.创建session <?php     //创建sessi ...

  2. JAVA中遍历Map和Set方法,取出map中所有的key

    Java遍历Set集合 1.迭代器遍历: Set<String> set = new HashSet<String>(); Iterator<String> it ...

  3. Hibernate_HelloWord

    Hibernate操作步骤 1.新建项目 2.加jar包 3.写XML配置文件hibernate.cfg.xml 4.写log4j.properties日志文件 5.在MySql数据库中建studen ...

  4. SpringBoot整合集成redis

    Redis安装:https://www.cnblogs.com/zwcry/p/9505949.html 1.pom.xml <project xmlns="http://maven. ...

  5. Linux用户和用户组管理 用户组管理命令

    添加用户组命令:groupadd 命令格式: [root@localhost ~]# groupadd [选项] 组名 选项: 选项 选项说明 -g GID 指定组ID: 修改用户组命令:groupm ...

  6. 【leetcode刷题笔记】Excel Sheet Column Number

    Related to question Excel Sheet Column Title Given a column title as appear in an Excel sheet, retur ...

  7. 基于linux的ekho(余音)安装与开发

    Ekho(余音)是一个把文字转换成声音的软件.它目前支持粤语.普通话(国语).诏安客语和韩语(试验中),英文则通过Festival间接实现.它比eSpeak的设计更简易,但文件较大.由于使用了真人发声 ...

  8. iMX6 yocto平台QT交叉编译环境搭建

    转:https://blog.csdn.net/morixinguan/article/details/79351909 . /opt/fsl-imx-fb/4.9.11-1.0.0/environm ...

  9. awk中打印连续多列,或者删除多列的技巧

    问题:比如有一个文件是20列,你只要后面的18列,怎么打印. 方法:把第一列和第二列做空:用print打印 [wangjq@mgmt humandb]$ cat test 1 2 3 4 5 6 7 ...

  10. PHP的垃圾回收机制以及大概实现

    垃圾回收,简称gc.顾名思义,就是废物重利用的意思.再说这个之前先接触一下内存泄露,大概意思就是申请了一块地儿拉了会儿屎,拉完之后不收拾,那么这块地就算糟蹋了,地越用越少,最后一地全是屎.说到底一句, ...