P1613 跑路

题目描述

小\(A\)的工作不仅繁琐,更有苛刻的规定,要求小\(A\)每天早上在\(6:00\)之前到达公司,否则这个月工资清零。可是小\(A\)偏偏又有赖床的坏毛病。于是为了保住自己的工资,小\(A\)买了一个十分牛B的空间跑路器,每秒钟可以跑\(2^k\)千米(\(k\)是任意自然数)。当然,这个机器是用\(long\) \(int\)存的,所以总跑路长度不能超过\(max\) \(long\) \(int\)千米。小\(A\)的家到公司的路可以看做一个有向图,小\(A\)家为点\(1\),公司为点\(n\),每条边长度均为一千米。小\(A\)想每天能醒地尽量晚,所以让你帮他算算,他最少需要几秒才能到公司。数据保证\(1\)到\(n\)至少有一条路径。

输入输出格式

输入格式:

第一行两个整数\(n\),\(m\),表示点的个数和边的个数。

接下来m行每行两个数字\(u\),\(v\),表示一条\(u\)到\(v\)的边。

输出格式:

一行一个数字,表示到公司的最少秒数。

说明

\(50\)%的数据满足最优解路径长度\(<=1000\);

\(100\)%的数据满足\(n<=50\),\(m<=10000\),最优解路径长度\(<=\) \(max\) \(long\) \(int\)。


首先,要确保自己的语文水平苟的住,这个鬼机器,每秒跑\(2^kkm\)的话是要跑刚好那么长的,不能多也不能少。

那么岂不是代表,只有长为\(2^kkm\)的链才算是有效边吗?

我们把所有有效边连上,跑最短路不就行了嘛。

如何求有效边?

\(2^k?\)有没有想到什么?

\(2^k=2^{k-1}+2^{k-1}?\)

对,就是倍增啊!

令\(g[u][v][j]\)代表点\(u\)到点\(v\)存在或不存在长度为\(2^j\)的边。

当\(g[u][k][j-1]\)和\(g[k][v][j-1]\)同时存在时,

\(g[u][v][j]\)存在。(\(k\)是枚举的一维)


#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int N=52;
int g[N][N][70],n,m;
//g[i][j][k]表示i点到j点存在边权为2^k的路
int g0[N][N];
int read()
{
    int x=0;char c=getchar();
    while(c<'0'||c>'9') c=getchar();
    while(c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();}
    return x;
}
queue <int > q;
int used[N],dis[N];
void spfa()
{
    memset(used,0,sizeof(used));
    used[1]=1;
    memset(dis,0x3f,sizeof(dis));
    dis[1]=0;
    q.push(1);
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        used[u]=0;
        for(int v=1;v<=n;v++)
            if(g0[u][v]&&dis[v]>dis[u]+g0[u][v])
            {
                dis[v]=dis[u]+g0[u][v];
                if(!used[v])
                {
                    used[v]=1;
                    q.push(v);
                }
            }
    }
}

int main()
{
    memset(g,0,sizeof(g));
    memset(g0,0,sizeof(g0));
    n=read(),m=read();
    int u,v;
    for(int i=1;i<=m;i++)
    {
        u=read(),v=read();
        g[u][v][0]=1;
        //f[u][v][0]=v;
    }
    for(int j=1;j<=64;j++)
        for(int k=1;k<=n;k++)
            for(u=1;u<=n;u++)
                for(v=1;v<=n;v++)
                    if(g[u][k][j-1]&&g[k][v][j-1])
                        g[u][v][j]=1;
    for(u=1;u<=n;u++)
        for(v=1;v<=n;v++)
            for(int j=0;j<=64;j++)
                if(g[u][v][j])
                {
                    g0[u][v]=1;
                    break;
                }
    spfa();
    printf("%d\n",dis[n]);
    return 0;
}

2018.5.2

洛谷 P1613 解题报告的更多相关文章

  1. 洛谷 P1462 解题报告

    P1462 通往奥格瑞玛的道路 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡 ...

  2. 洛谷 P1879 解题报告

    P1879 [USACO06NOV]玉米田Corn Fields 题目描述 农场主\(John\)新买了一块长方形的新牧场,这块牧场被划分成\(M\)行\(N\)列\((1 ≤ M ≤ 12; 1 ≤ ...

  3. 洛谷 P1069 解题报告

    P1069 细胞分裂 题目描述 \(Hanks\)博士是\(BT\) (\(Bio-Tech\),生物技术) 领域的知名专家.现在,他正在为一个细胞实验做准备工作:培养细胞样本. \(Hanks\) ...

  4. 洛谷 P2491 解题报告

    P2491 消防 题目描述 某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000). 这个国家的人对火焰有超越宇宙的热情,所以这个 ...

  5. 洛谷 P2587 解题报告

    P2587 [ZJOI2008]泡泡堂 题目描述 第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省的代表队由n名选手组成,比赛的项目是老少咸宜的网络游戏 ...

  6. 洛谷 P1054 解题报告

    P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...

  7. 洛谷 P1053 解题报告

    P1053 篝火晚会 题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了"小教官".在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有 ...

  8. 洛谷 P1057 解题报告

    P1057 传球游戏 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹 ...

  9. 洛谷 P1430 解题报告

    P1430 序列取数 题目描述 给定一个长为\(n\)的整数序列\((n<=1000)\),由\(A\)和\(B\)轮流取数(\(A\)先取).每个人可从序列的左端或右端取若干个数(至少一个), ...

随机推荐

  1. python异常处理和断言

    http://blog.csdn.net/pipisorry/article/details/21841883 关于异常处理有必要么的讨论 最重要的问题是你在开发过程中隐藏了bug,如果当时你没加这个 ...

  2. mysql进阶(七)limit的用法

    limit是mysql的语法 select * from table limit m,n 其中m是指记录开始的index,从0开始,表示第一条记录 n是指从第m+1条开始,取n条. select *  ...

  3. 【一天一道LeetCode】#38. Count and Say

    一天一道LeetCode系列 (一)题目 The count-and-say sequence is the sequence of integers beginning as follows: 1, ...

  4. boost::this_thread::sleep_for()死锁

    boost::this_thread::sleep_for()会死锁 (金庆的专栏) 发现睡眠1ms很容易死锁.boost::this_thread::sleep_for(boost::chrono: ...

  5. Google官方网络框架Volley实战——QQ吉凶测试,南无阿弥陀佛!

    Google官方网络框架Volley实战--QQ吉凶测试,南无阿弥陀佛! 这次我们用第三方的接口来做一个QQ吉凶的测试项目,代码依然是比较的简单 无图无真相 直接撸代码了,详细解释都已经写在注释里了 ...

  6. Linux之ulimit详解(整理)

    修改:一般可以通过ulimit命令或编辑/etc/security/limits.conf重新加载的方式使之生效通过ulimit比较直接,但只在当前的session有效,limits.conf中可以根 ...

  7. DB Query Analyzer 5.05 is released, 65 articles concerned have been published

    DB Query Analyzer 5.05 is released, 65 articles concerned have been published DB Query Analyzer is p ...

  8. SharePoint 2007 单列表模糊查询SPD定制

    应用场景:项目中总会遇到一些列表,存着是用户.项目等数据,而我们需要查询有哪些项目,这时候,就需要用到模糊查询了,而这样的查询,基本不需要跨列表,所以,也没必要配置复杂的搜索,用Designer(简称 ...

  9. 配置SharePoint环境加域提示网络名不可用[已解决]

    今天去客户给机器做备机,带着装好SharePoint07的机器跑过去了,先做个LAN,然后连上机器开始工作:首先当然是改ip地址,然后都改好了开始加域,加了好几次,发现都不行,提示"指定的网 ...

  10. 双系统或三系统:Grub Rescue修复方法

    我是在装三系统的时候(1.WIN 7 ,2.Ubuntu 12.04 ,3.CentOS 6.4 ),中间步骤出错,造成引导区覆盖,grub乱掉了. 症状: 开机显示:GRUB loading err ...