點此看題面
大致題意:小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 的最短路不一定是所求答案,即...