小\(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 ...