• 【题解】Luogu P1613 跑路 倍增+最短路


    基本算法4-1


    题里都说了$2^k$,明显倍增

    因为跑路器的存在,不能直接跑最短路的原因:

    如图,如果直接最短路从1号点到5号点的距离为3,需要3秒

    而实际上走$1->5$这条边,因为$8=2^3$,只需1秒

    $n≤50$直接无脑floyed随便跑

    code

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 namespace gengyf{
     4 #define ll long long
     5 const int maxn=1e6+10;
     6 inline int read(){
     7     int x=0,f=1;
     8     char c=getchar();
     9     while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    10     while(c>='0'&&c<='9'){x=(x*10)+c-'0';c=getchar();}
    11     return x*f;
    12 }
    13 int n,m,dis[60][60];//dis[i][j]从i到j所需的时间
    14 bool e[60][60][35];//e[i][j][k]是否存在一条从i到j距离是2^k的路径
    15 int main(){
    16     memset(dis,0x3f3f3f3f,sizeof(dis));
    17     n=read();m=read();
    18     for(int i=1;i<=m;i++){
    19         int u,v;u=read();v=read();
    20         e[u][v][0]=1;
    21         dis[u][v]=1;
    22     }
    23     for(int t=1;t<=35;t++)
    24         for(int i=1;i<=n;i++)
    25             for(int j=1;j<=n;j++)
    26                 for(int k=1;k<=n;k++){
    27                     if(e[i][j][t-1]&&e[j][k][t-1]){
    28                         e[i][k][t]=1;
    29                         dis[i][k]=1;
    30                     }
    31                 }
    32     for(int k=1;k<=n;k++)
    33         for(int i=1;i<=n;i++)
    34             for(int j=1;j<=n;j++){
    35                 dis[i][j]=min(dis[i][k]+dis[k][j],dis[i][j]);
    36             }
    37     printf("%d",dis[1][n]);
    38     return 0;
    39 }
    40 }
    41 signed main(){
    42   gengyf::main();
    43   return 0;
    44 }
    View Code
  • 相关阅读:
    Spring中使用RedisTemplate操作Redis(spring-data-redis)
    Cron表达式
    自己搭建v,p,n过程
    CentOS 7安装与配置jdk-8u162
    .net自动生成版本号
    关于webapi 返回的类型的笔记
    多个系统间交互-灰度发布-一些笔记
    Unity的使用
    mysql中查询"_"这种特殊字符
    关于MVC中DropDownListFor的一个bug
  • 原文地址:https://www.cnblogs.com/gengyf/p/11625567.html
Copyright © 2020-2023  润新知