[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