洛谷 P1613 跑路 解題報告

2022-04-30 06:51:06 字數 1635 閱讀 7639

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

\(int\)存的,所以總跑路長度不能超過\(max\)

\(long\)

\(int\)千公尺。小\(a\)的家到公司的路可以看做乙個有向圖,小\(a\)家為點\(1\),公司為點\(n\),每條邊長度均為一千公尺。小\(a\)想每天能醒地盡量晚,所以讓你幫他算算,他最少需要幾秒才能到公司。資料保證\(1\)到\(n\)至少有一條路徑。

第一行兩個整數\(n\),\(m\),表示點的個數和邊的個數。

接下來m行每行兩個數字\(u\),\(v\),表示一條\(u\)到\(v\)的邊。

一行乙個數字,表示到公司的最少秒數。

\(50\)%的資料滿足最優解路徑長度\(<=1000\);

\(100\)%的資料滿足\(n<=50\),\(m<=10000\),最優解路徑長度\(<=\)

\(max\)

\(long\)

\(int\)。

首先,要確保自己的語文水平苟的住,這個鬼機器,每秒跑\(2^kkm\)的話是要跑剛好那麼長的,不能多也不能少。

那麼豈不是代表,只有長為\(2^kkm\)的鏈才算是有效邊嗎?

我們把所有有效邊連上,跑最短路不就行了嘛。

如何求有效邊?

\(2^k?\)有沒有想到什麼?

\(2^k=2^+2^?\)

對,就是倍增啊!

令\(g[u][v][j]\)代表點\(u\)到點\(v\)存在或不存在長度為\(2^j\)的邊。

當\(g[u][k][j-1]\)和\(g[k][v][j-1]\)同時存在時,

\(g[u][v][j]\)存在。(\(k\)是列舉的一維)

#include #include #include using namespace std;

const int n=52;

int g[n][n][70],n,m;

//g[i][j][k]表示i點到j點存在邊權為2^k的路

int g0[n][n];

int read()

return x;

}queue q;

int used[n],dis[n];

void spfa()}}

}int main()

for(int j=1;j<=64;j++)

for(int k=1;k<=n;k++)

for(u=1;u<=n;u++)

for(v=1;v<=n;v++)

if(g[u][k][j-1]&&g[k][v][j-1])

g[u][v][j]=1;

for(u=1;u<=n;u++)

for(v=1;v<=n;v++)

for(int j=0;j<=64;j++)

if(g[u][v][j])

spfa();

printf("%d\n",dis[n]);

return 0;

}

2018.5.2

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