1. 程式人生 > >P1613 【跑路】

P1613 【跑路】

小A的工作不僅繁瑣,更有苛刻的規定,要求小A每天早上在6:00之前到達公司,否則這個月工資清零。可是小A偏偏又有賴床的壞毛病。於是為了保住自己的工資,小A買了一個十分牛B的空間跑路器,每秒鐘可以跑2^k千米(k是任意自然數)。當然,這個機器是用longint存的,所以總跑路長度不能超過maxlongint千米。小A的家到公司的路可以看做一個有向圖,小A家為點1,公司為點n,每條邊長度均為一千米。小A想每天能醒地儘量晚,所以讓你幫他算算,他最少需要幾秒才能到公司。資料保證1到n至少有一條路徑。

 1 #include<iostream>
 2 #include<cstdio>
 3
#include<cstring> 4 using namespace std; 5 long long read() 6 { 7 long long x=0,f=1; char c=getchar(); 8 while(!isdigit(c)){if(c=='-') f=-1;c=getchar();} 9 while(isdigit(c)){x=x*10+c-'0';c=getchar();} 10 return x*f; 11 } 12 const int N=50+10; 13 const int K=65+10; 14 int f[N][N][K],dis[N][N],n,m;
15 int main() 16 { 17 n=read(),m=read(); 18 memset(dis,0x3f,sizeof dis); 19 for(int i=1;i<=m;i++) 20 { 21 int s=read(),t=read(); 22 f[s][t][0]=1; 23 dis[s][t]=1; 24 } 25 26 for(int o=1;o<=64;o++) 27 for(int i=1;i<=n;i++) 28 for
(int j=1;j<=n;j++) 29 for(int k=1;k<=n;k++) 30 if(f[j][i][o-1]==true and f[i][k][o-1]==true) 31 { 32 f[j][k][o]=true; 33 dis[j][k]=1; 34 } 35 36 for(int i=1;i<=n;i++) 37 for(int j=1;j<=n;j++) 38 for(int k=1;k<=n;k++) 39 dis[j][k]=min(dis[j][k],dis[j][i]+dis[i][k]); 40 41 printf("%d",dis[1][n]); 42 return 0; 43 }