[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 }

 

posted @ 2019-10-18 22:08  Xx_queue  阅读(113)  评论(0编辑  收藏  举报