[日常摸鱼]luogu1613跑路

新年A的第一道题2333

https://www.luogu.org/problemnew/show/P1613

题意:给一张有向图,每条边长为1,每个单位时间只能走$2^k$的长度,$k$可以任意选,问从起点到终点的最短时间



我好菜呀一看到题还是不会做orz

我们用一个$G[i][j][k]$数组来表示$i$到$j$是否存在$2^k$的路径,用$dis[i][j]$表示$i$到$j$需要的最短时间,有连边的两个点就直接让$G[i][j][0]=1,dis[i][j]=1$,然后类似倍增那样子去更新所有节点,最后跑一遍Floyd

(比较短就不折了x)

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=55;
int n,m;
int dis[N][N];
bool G[N][N][70];

int main()
{
    scanf("%d%d",&n,&m);
    memset(dis,10,sizeof(dis));
    for(register int i=1;i<=m;i++)
    {
        int u,v;scanf("%d%d",&u,&v);
        dis[u][v]=1;G[u][v][0]=1;
    }
    for(register int k=1;k<=64;k++)
        for(register int i=1;i<=n;i++)
            for(register int t=1;t<=n;t++)
                for(register int j=1;j<=n;j++)
                    if(G[i][t][k-1]&&G[t][j][k-1])
                    {
                        G[i][j][k]=1;dis[i][j]=1;
                    }

    for(register int k=1;k<=n;k++)
        for(register int i=1;i<=n;i++)
            for(register int j=1;j<=n;j++)
                dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);

    printf("%d",dis[1][n]);
    return 0;
}

原文地址:https://www.cnblogs.com/yoooshinow/p/8166445.html

时间: 2024-11-05 20:36:25

[日常摸鱼]luogu1613跑路的相关文章

[日常摸鱼]Uva11178Morley&#39;s Theorem-几何

题意:给一个$\Delta ABC$,分别做三个角的三等分线相交成$\Delta DEF$,求出$D,E,F$的坐标. 直接根据题意模拟 #include<cstdio> #include<cmath> #include<algorithm> using namespace std; struct Point { double x,y; Point(double x1=0,double y1=0){x=x1;y=y1;} }; typedef Point Vector;

[日常摸鱼]「网络流 24 题」试题库

https://loj.ac/problem/6006 题意:$n$道题每题有若干种类别,一共有$k$种类别,告诉你每种类别各自需要的题数,构造一种选题目的方案并输出方案. 虽然题目好像没说不过一道题应该不能选多次-(反正我这么写的过掉了x 这道题做下来感觉莫名的很爽233 把每道题向其对应的类别连容量为1的边,源点向所有题也连容量为1的边,而所有类别向汇点连的边容量为该题所需要的题数. 从源点到汇点跑一遍最大流,每次找到增广路我们要更新这条路上唯一的那个对应类别的结点,于是我们就想到用EK来实

[日常摸鱼]bzoj1001狼抓兔子-最大流最小割

题意就是求最小割- 然后我们有这么一个定理(最大流-最小割定理 ): 任何一个网络图的最小割中边的容量之和等于图的最大流. (下面直接简称为最大流和最小割) 证明: 如果最大流>最小割,那把这些割边删去之后依然能找到一条增广路使得源点和汇点联通,和这些边是最小割矛盾.故最大流$\leq$最小割. 而如果最大流<最小割,可是这样通过这些割边还能有更大的流,和最大流矛盾. 综上,最大流=最小割~ 然后看看这道题-哇$n\leq 1000$,百万个点百万条边-好吧Dinic其实跑得过-而且还蛮快的-

[日常摸鱼]UVA393 The Doors 简单计算几何+最短路

The  Boy Next   Doors 题意:给定一个固定大小的房间($x,y$的范围都是$[0,10]$),有$n$个墙壁作为障碍(都与横坐标轴垂直),每个墙壁都有两扇门分别用四个点来描述,起点终点固定在$(0,5)$和$(10,5)$,求起点到终点的最短路长度,$n<=18$ 题解: 我们把每堵墙的每一"段"作为一条线段,对任意两点$u,v$,如果两点间的连线不和其他线段相交,那我们从$u$走到$v$的最短距离就是他们的欧几里得距离,对所有点对都这么做一遍,处理出所有能够

[日常摸鱼]bzoj1502[NOI2005]月下柠檬树-简单几何+Simpson法

关于自适应Simpson法的介绍可以去看我的另一篇blog http://www.lydsy.com/JudgeOnline/problem.php?id=1502 题意:空间里圆心在同一直线上且底面与地面平行的若干个圆台和顶层的圆锥以$\alpha$的角度投影到地面,求投影的面积. (其实我是看po姐博客来的x) 首先把圆锥的顶点也看成一个半径为0的圆满,对于每个高度为$h$的圆投影下去的坐标是$h/tan(\alpha)$,半径不变,而对于圆台的侧面投影下去是上下底两个圆的切线. 关于两个圆

Luogu1613 跑路-倍增+Floyd

Solution 挺有趣的一道题, 仔细想想才想出来 先用$mp[i][j][dis]$ 是否存在一条 $i$ 到 $j$ 的长度为 $2^{dis}$ 的路径. 转移 : 1 for (int dis = 1; dis < base; ++dis) 2 for (int k = 1; k <= n; ++k) 3 for (int i = 1; i <= n; ++i) if (mp[i][k][dis - 1]) 4 for (int j = 1; j <= n; ++j) i

[日常摸鱼]JSOI2008最大数

校运会的时候随手抽的题- 一句话题意 维护一个序列,初始为空,要求滋兹: 1.查询这个序列末尾$x$个数的最大值 2.设上一次查询的答案为$t$(如果还没查询$t=0$),在末尾插入一个数$(x+t)mod d$,$d$为给定常数 很容易想到用线段树做:记录序列的末尾,然后直接单点修改区间查询 本来想随便写完就过了的-然后一直爆零- 因为我写了一句 while(n--) 然后这题应该就没什么要注意的地方了233 贴代码 #include<cstdio> #include<cstring&

[日常摸鱼]杜教筛

因为博主比较菜所以可能一些地方写的有问题或者不清楚,以及我的废话有点多- 在这里先感谢下小伙伴ww @MoebiusMeow 的帮助~ 参考资料: [1]浅谈一类积性函数的前缀和(skywalkert) [2]杜教筛--省选前的学习1(_rqy) (下面约定$[p]$表示满足条件$p$时为1不满足为0,以及下面说的函数都是数论函数) 前置技能(一些定义) 数论函数:若$f:Z^{+} \rightarrow C$,则称$f$为数论函数 积性函数:若一个数论函数$f(n)$对于所有$m_1 \bo

[日常摸鱼]字符串相关

最近开始学字符串-之前暑假听JOHNKROM大爷讲这个的时候就很懵(当时根本没碰过这个东西-) 这里大概会有一些相关的算法和自己做的题,还有存一些模板啥的. 由于我太弱了所以可能不会写有关原理的东西(或者等我哪天会了有空再补)如果是刚学的话还是去网上找教程吧-我就存个题还有模板啥的orz Trie字典树(Trie),根节点为空节点,其他节点(或边上)放字母,然后节点上还能储存一些其他信息. 1.一个类似模板题的东西:luogu2580 建一颗Trie,把所有名字插进去,结束的地方打个标记,具体见