加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:13:22 所属栏目:百科 来源:网络整理
导读:题里都说了$2^k$,明显倍增 因为跑路器的存在,不能直接跑最短路的原因: 如图,如果直接最短路从1号点到5号点的距离为3,需要3秒 而实际上走$1-5$这条边,因为$8=2^3$,只需1秒 ? ? $n≤50$直接无脑floyed随便跑 code 1 #include bits/stdc++.h 2 using nam

题里都说了$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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读