zoukankan      html  css  js  c++  java
  • [2019 CSP-S赛前集训] [洛谷P1613] 跑路

    题目链接:https://www.luogu.org/problem/P1613

    题目已经提示的很明显了!

    每次可以跑2k千米,明显就和倍增有关嘛;

    再看数据范围,n<=50,这就是提示我们用floyd来求最短路啊;

    于是解法就出来了,开一个数组(如:C[i][j][k]),

    表示从点i到点j是否存在一条路径满足长度为2k,再跑一遍floyd就大功告成了.

    (注意路径最长maxlongint,其实longint就是int,也不用把k的范围搞成64,32就足够了)

     1 #include <bits/stdc++.h>
     2 #define MAXN 50+5
     3 using namespace std;
     4 int n,m,ans;
     5 int C[MAXN][MAXN][MAXN],c[MAXN][MAXN];
     6 void floyd()
     7 {
     8     for(int k=1;k<=n;k++)
     9     {
    10         for(int i=1;i<=n;i++)
    11         {
    12             for(int j=1;j<=n;j++)
    13             {
    14                 if(c[i][j]>c[i][k]+c[k][j])
    15                     c[i][j]=c[i][k]+c[k][j];
    16             }
    17         }
    18     }
    19 }
    20 int main()
    21 {
    22     scanf("%d%d",&n,&m);
    23     memset(c,0x3f,sizeof(c));
    24     for(int i=1;i<=m;i++)
    25     {
    26         int u,v;
    27         scanf("%d%d",&u,&v);
    28         C[u][v][0]=1;
    29         c[u][v]=1;
    30     }
    31     for(int k=1;k<=32;k++)
    32     {
    33         for(int i=1;i<=n;i++)
    34             for(int j=1;j<=n;j++)
    35                 for(int p=1;p<=n;p++)
    36                     if(C[i][j][k-1]&&C[j][p][k-1])
    37                     {
    38                         C[i][p][k]=1;
    39                         c[i][p]=1;
    40                     }
    41     }
    42     floyd();
    43     printf("%d",c[1][n]);
    44     return 0;
    45 }
    转载请注明出处--Xx_queue
  • 相关阅读:
    JS: Promise
    JS: 数据结构与算法之栈
    JS: 数组乱序
    JS: 数组扁平化
    JS:函数柯里化
    JS: 防抖节流
    JS:事件委托
    理解Node.js(译文)
    Javascript闭包入门(译文)
    你真的懂ajax吗?
  • 原文地址:https://www.cnblogs.com/Xx-queue/p/11701125.html
Copyright © 2011-2022 走看看