洛谷1613 跑路(倍增 最短路)

2021-08-29 13:52:06 字數 1782 閱讀 3828

點此看題面

大致題意:小a

aa要從1

11號節點到n

nn號節點,已知他每個單位時間可以跑2

k2^k

2k千公尺,求他最少需要多少個單位時間。

預處理由於資料範圍較小,我們可以先大力預處理。

首先,將題目中給出的邊邊權初始化為000。

若從一點出發,到兩點皆有一條邊權為k

kk的邊,就將這兩點之間連一條邊權為k+1

k+1k+

1的邊。

這樣重複n

nn次,就能保證所有該連的邊都連好了。

s pf

aspfa

spfa

跑最短路

然後,我們可以在這張圖上跑最短路了。

注意,無論邊權為多少,每條邊長度皆為1

11

**

#include

#define max(x,y) ((x)>(y)?(x):(y))

#define min(x,y) ((x)<(y)?(x):(y))

#define uint unsigned int

#define ll long long

#define ull unsigned long long

#define swap(x,y) (x^=y,y^=x,x^=y)

#define abs(x) ((x)<0?-(x):(x))

#define inf 1e9

#define inc(x,y) ((x+=(y))>=mod&&(x-=mod))

#define ten(x) (((x)<<3)+((x)<<1))

#define n 50

#define log 50

#define add(x,y,z) (!exist[x][y][z]&&(e[++ee].nxt=lnk[x],e[lnk[x]=ee].to=y,e[ee].val=z,exist[x][y][z]=1))

using

namespace std;

int n,m,ee=

0,lnk[n+5]

,exist[n+5]

[n+5

][log+5]

;struct edge

e[n*n*log+5]

;class

fioinline

void

read

(int

&x)inline

void

read_char

(char

&x)inline

void

read_string

(string &x)

inline

void

write

(int x)

inline

void

write_char

(char x)

inline

void

write_string

(string x)

inline

void

end(

)}f;

class

class_spfa

inline

intgetans

(int s,

int t)

//spfa跑最短路

}return dis[t];}

}spfa;

intmain()

洛谷 P1613 跑路(倍增 最短路)

小a的工作不僅繁瑣,更有苛刻的規定,要求小a每天早上在6 00之前到達公司,否則這個月工資清零。可是小a偏偏又有賴床的壞毛病。於是為了保住自己的工資,小a買了乙個十分牛b的空間跑路器,每秒鐘可以跑2 k千公尺 k是任意自然數 當然,這個機器是用longint存的,所以總跑路長度不能超過maxlong...

洛谷P1613 跑路 最短路 倍增

小a的工作不僅繁瑣,更有苛刻的規定,要求小a每天早上在6 00之前到達公司,否則這個月工資清零。可是小a偏偏又有賴床的壞毛病。於是為了保住自己的工資,小a買了乙個十分牛b的空間跑路器,每秒鐘可以跑2 k千公尺 k是任意自然數 當然,這個機器是用longint存的,所以總跑路長度不能超過maxlong...

洛谷 P1613 跑路 倍增 最短路

題目傳送門 大致題意 給定一張 n 個結點 m 條邊的有向圖,邊權固定為1,每秒可以移動 2 t t 為任意值 求從 1 到 n 的最短所需時間。其中 n leq 50,m leq 10000,dis leq int 第一眼是個最短路,然後發現不對勁。因為從 1 到 n 的最短路不一定是所求答案,即...