傳送門啦
分析:
這個題看很多人都在用floyd和倍增的方法來做的。
那我就用spfa來跑最短路吧
a[i][j][k]:表示從i到j是否存在長2^k的邊。
預處理的時候就將這些邊賦值成1 (長2^k的邊)(再補充一下:這些邊用1s就能走完)
注意一下:
預處理的時候k迴圈在最外層,因為要所有的從u到v長度為2^k的邊,然後賦值成1.
而打標記的時候k放在了最後一層迴圈上,因為要把u到v邊上的情況全部試一遍。。好像不太清楚。。
就是u到v的邊的值我們不確定,所以都列舉試一遍。 (從0開始,被這個卡了好幾次)
#include #include#include
#include
#include
using
namespace
std;
const
int maxn = 55
;long
long n,m,u,v,a[maxn][maxn][65
]; long
long
f[maxn][maxn];
long
long
dis[maxn];
bool
vis[maxn];
void spfa(int
s) q.push(s);
dis[s] = 0
; vis[s] = 1
;
while(!q.empty())}}
}int
main()
for(int k=1;k<=64;k++)
for(int j=1;j<=n;j++)
for(int u=1;u<=n;u++)
for(int v=1;v<=n;v++)
if(a[u][j][k-1] && a[j][v][k-1
]) a[u][v][k]=1
;
for(int u=1;u<=n;u++)
for(int v=1;v<=n;v++)
for(int k=0;k<=64;k++)
if(a[u][v][k])
spfa(1);
printf(
"%lld
",dis[n]);
return0;
}
最後wustdio給我介紹了一種矩陣加速的寫法。。
洛谷 P1613 跑路
題目描述 小a的工作不僅繁瑣,更有苛刻的規定,要求小a每天早上在6 00之前到達公司,否則這個月工資清零。可是小a偏偏又有賴床的壞毛病。於是為了保住自己的工資,小a買了乙個十分牛b的空間跑路器,每秒鐘可以跑2 k千公尺 k是任意自然數 當然,這個機器是用longint存的,所以總跑路長度不能超過ma...
跑路 洛谷p1613
小a的工作不僅繁瑣,更有苛刻的規定,要求小a每天早上在6 00之前到達公司,否則這個月工資清零。可是小a偏偏又有賴床的壞毛病。於是為了保住自己的工資,小a買了乙個十分牛b的空間跑路器,每秒鐘可以跑2 k千公尺 k是任意自然數 當然,這個機器是用longint存的,所以總跑路長度不能超過maxlong...
洛谷p1613 跑路
大致題意 給一張有向圖 存在自環 每條邊權均為1,現在有一人要從1號結點走到n號結點,但是這個人有乙個神奇的瞬移機器,這個機器走2 k2 k 2k k kk為自然數 花費的時間都為1,問從起點到終點的最小花費時間。思路如下 step 1.我們可以處理出所有的從乙個點到達另乙個點的距離可以為2 k2 ...