這道題題意不是很清楚。在翻看了幾個討論後,理清了題意。
這道題有環,有重邊,甚至可能一次性到終點,而整段路線繞著某個環跑好多圈。每次跳必須要到乙個點。
然後這道題要倍增,來判斷從乙個點是否能一次到另乙個點。
所以設$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 23using
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 ...