洛谷P1613 跑路

2022-03-25 18:51:04 字數 1561 閱讀 1509

這道題題意不是很清楚。在翻看了幾個討論後,理清了題意。

這道題有環,有重邊,甚至可能一次性到終點,而整段路線繞著某個環跑好多圈。每次跳必須要到乙個點。

然後這道題要倍增,來判斷從乙個點是否能一次到另乙個點。

所以設$e[i][j][k]$表示從第$i$個點是否存在一條路徑長為$2^k$到點$j$。

更新跟$floyd$很相像,若$e[i][p][k-1] \ \&\&\ e[p][j][k-1]$為$1$,則$e[i][j][k]$為1。

然後點$i$到點$j$能否直接跳達就轉變成$e[i][j][1..32]$中是否有1。設成$32$是因為$2^32$符合題意$maxlongint$。

構圖跑最短路即可。

1 #include 2

3using

namespace

std;45

#define re register

6#define rep(i, a, b) for (re int i = a; i <= b; ++i)

7#define repd(i, a, b) for (re int i = a; i >= b; --i)

8#define maxx(a, b) a = max(a, b);

9#define minn(a, b) a = min(a, b);

10#define ll long long

11#define inf (1 << 30)

1213

const

int maxn = 50 + 5, maxk = 35;14

15 inline int

read()

2122

intn, m, e[maxn][maxn][maxk];

23ll e[maxn][maxn];

2425

intmain()

33 rep(k, 1, maxk - 1

)34 rep(p, 1

, n)

35 rep(i, 1

, n)

36 rep(j, 1

, n)

37 e[i][j][k] |= e[i][p][k-1] & e[p][j][k-1

];38

39 rep(i, 1

, n)

40 rep(j, 1

, n)

4546 rep(k, 1

, n)

47 rep(i, 1

, n)

48 rep(j, 1

, n)

49if (i != k && j !=k)

50 minn(e[i][j], e[i][k] +e[k][j]);

5152 printf("

%lld

", e[1

][n]);

53return0;

54 }

洛谷 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 ...