比較有趣的floyd,剛開始還真沒看出來。。。。(下午腦子不太清醒)
先考慮一下floyd本身的實現原理,
for(k=1;k<=n;k++)列舉圖中的每乙個點,用這些點去逐次更新當前的圖,最終得到的dis值就是最終的每兩點的最小距離for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(e[i][j]>e[i][k]+e[k][j])
e[i][j]=e[i][k]+e[k][j]
沒有學過floyd的同學可以參考啊哈磊的floyd講解
那麼對於這道題目,我們就可以直接按照每個點修好的時間排序,按照該順序加入點,進行floyd,輸出dis值即為結果
1 #include 2 #include 3 #include 45const
int maxn = 500;6
const
int inf = 0x3f3f3f3f >> 1;7
intdis[maxn][maxn];
8int
pointtime[maxn];
9int askx[50500], asky[50500], askt[50500
];10
intn, m;
11int tot = 0;12
intx, y, z;
13int
q;14
int cur = 0;15
16void update(int
x) 21}22
23int
main ()
32for (int i = 1; i <= m; i++)
37 scanf("
%d", &q);
38for (int i = 1; i <= q; i++)
44if (dis[askx[i]][asky[i]] >= inf || pointtime[askx[i]] > askt[i] || pointtime[asky[i]] > askt[i]) printf("
-1\n");
45else printf("
%d\n
", dis[askx[i]][asky[i]]);46}
4748
49return0;
50 }
洛谷 1119 災後重建 Floyd
比較有趣的floyd,剛開始還真沒看出來。下午腦子不太清醒 先考慮一下floyd本身的實現原理,for k 1 k n k for i 1 i n i for j 1 j n j if e i j e i k e k j e i j e i k e k j 列舉圖中的每乙個點,用這些點去逐次更新當前...
floyd 洛谷P1119 災後重建
我靠!我連floyd都忘拉 考考空空曠曠坎坎坷坷!我們floyd不是要列舉k,i,j 對於這個k,我們僅僅是用k去跟新其他邊 這個k是存在的 換句話說,f x k 這個值在k被列舉到之前就是會不斷更新的 我一開始以為k是消失的,列舉到k的時候會產生乙個k 我靠,這個題目有毒,我連floyd都不會拉 ...
洛谷 P1119 災後重建(Floyd)
b地區在 過後,所有村莊都造成了一定的損毀,而這場 卻沒對公路造成什麼影響。但是在村莊重建好之前,所有與未重建完成的村莊的公路均無法通車。換句話說,只有連線著兩個重建完成的村莊的公路才能通車,只能到達重建完成的村莊。給出b地區的村莊數n,村莊編號從0到n 1,和所有m條公路的長度,公路是雙向的。並給...