日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

洛谷P1119 灾后重建 图论 脑洞题

發(fā)布時(shí)間:2025/3/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 洛谷P1119 灾后重建 图论 脑洞题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

洛谷P1119 災(zāi)后重建

圖論 ? 腦洞題 ? floyd ??
floyd中 k 的意義 通過前 k 個(gè)點(diǎn) 作為中間的節(jié)點(diǎn) 更新 i 到 j 的最短路 也就是 只經(jīng)過前 k 個(gè)點(diǎn) 的最短路


幫助理解Floyd算法的好題!初學(xué)Floyd算法時(shí),相信很多人和我一樣,只是把幾行代碼背下來,
并沒有了解Floyd算法到底是什么原理。以下介紹Floyd算法的原理:

Floyd算法的本質(zhì)是動(dòng)態(tài)規(guī)劃,其轉(zhuǎn)移方程為:f(k,i,j) = min( f(k-1,i,j), f(k-1,i,k)+f(k-1,k,j) )。

f(k,i,j)表示路徑除開起點(diǎn)i與終點(diǎn)j,只經(jīng)過前k個(gè)點(diǎn)中的某些點(diǎn),從i到j(luò)的最小值。計(jì)算這個(gè)值只需要考慮兩種情況:
最短路經(jīng)過k,和最短路不經(jīng)過k(那么就經(jīng)過前k-1個(gè)點(diǎn)中的某些點(diǎn))。由于k要從k-1轉(zhuǎn)移而來,自然k為最外層的循環(huán)。
而經(jīng)過狀態(tài)壓縮(類似于背包問題)后,就變成了我們熟悉的f(i,j) = min( f(i,j), f(i,k)+f(k,j) )了。

本題同理,只是k表示的是最先修好的前k個(gè)村莊。不過由于出題人非常良心地幫我們把修理時(shí)間和詢問時(shí)間都排序了,
所以就沒什么關(guān)系了- -用Floyd枚舉k時(shí),枚舉到下一個(gè)詢問的時(shí)間點(diǎn)就停止?;卮鹪儐栔?#xff0c;再繼續(xù)枚舉。

?

1 #include <cstdio> 2 #include <cmath> 3 #include <cstdlib> 4 #include <cstring> 5 #include <string> 6 #include <iostream> 7 #include <iomanip> 8 using namespace std ; 9 10 const int maxn = 211,maxq = 50011,inf = 1e9 ; 11 int n,m,Q,now ; 12 int e[maxn][maxn],t[maxn] ; 13 int tq[maxq],qs[maxq],qt[maxq] ; 14 15 inline int read() 16 { 17 char ch = getchar() ; 18 int x = 0 , f = 1 ; 19 while(ch<'0'||ch>'9') { if( ch=='-' ) f = -1 ; ch = getchar() ; } 20 while(ch>='0'&&ch<='9') { x = x*10 + ch - 48 ; ch = getchar() ; } 21 return x * f ; 22 } 23 24 inline int print(int now) 25 { 26 if( t[ qs[now] ] > tq[ now ] || t[ qt[now] ] > tq[ now ] ) 27 return -1 ; 28 if( e[qs[now]][qt[now]]==inf ) 29 return -1 ; 30 return e[qs[now]][qt[now]] ; 31 } 32 33 int main() 34 { 35 n = read() ; m = read() ; 36 for(int i=0;i<n;i++) t[ i ] = read() ; 37 for(int i=0;i<n;i++) 38 for(int j=0;j<n;j++) e[ i ][ j ] = inf ; 39 40 41 int x,y,v ; 42 for(int i=1;i<=m;i++) 43 { 44 x = read() ; y = read() ; v = read() ; 45 e[ x ][ y ] = v ; e[ y ][ x ] = v ; 46 } 47 48 Q = read() ; 49 for(int i=1;i<=Q;i++) 50 { 51 qs[ i ] = read() ; qt[ i ] = read() ; tq[ i ] = read() ; 52 } 53 54 now = 1 ; 55 for(int k=0;k<n;k++) 56 { 57 while( now <= Q && tq[now] < t[ k ] ) // 這樣相當(dāng)于做詢問 Q 是 就已經(jīng)將 在他之前的 邊考慮到 58 //詢問的時(shí)間小于當(dāng)前時(shí)間則輸出 59 { 60 printf("%d\n",print( now ) ) ; 61 now++ ; 62 } 63 for(int i=0;i<n;i++) 64 for(int j=0;j<n;j++) 65 e[ i ][ j ] = min(e[ i ][ j ],e[ i ][ k ] + e[ k ][ j ]) ; 66 } 67 68 while( now<=Q ) 69 { 70 printf("%d\n",print(now)) ; 71 now++ ; 72 } 73 74 return 0 ; 75 }

?

轉(zhuǎn)載于:https://www.cnblogs.com/third2333/p/7097440.html

與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的洛谷P1119 灾后重建 图论 脑洞题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。