神即將帶領一些人去他們的孤寂之境,由於這個世界的不穩定,地點之間的有向道路會不定期地毀壞,出於工作準備,神想知道在某些道路毀壞之後某兩點之間的最短路。
就是給定乙個有向圖,現有兩個操作,操作 1 是刪除一條邊(一條邊可重複刪除),操作 2是詢問兩個點之間的最短路。
第 1 行兩個正整數 n, m,分別表示圖的點數和運算元。
第 2 行至第 n + 1 行每行 n 個正整數,為圖的鄰接矩陣,第 i 行第 j 列的數表示點 i 和點j 間距離,保證對角線為 0。
接下來 m 行每行三個正整數 c, x, y,c 表示操作種類,為 1 或 2,當 c = 1 時表示刪除 x與 y 相連的邊,當 c = 2 時表示詢問 x 到 y 的最短路,若不可達則輸出 −1。
輸出若干行,每個 2 操作對應一行,答案為詢問中 x 到 y 的最短路或 −1
5 60 6 6 10 10
2 0 7 8 6
10 5 0 10 3
9 5 8 0 7
4 9 8 3 0
1 2 3
1 4 1
2 1 3
1 4 2
1 1 2
2 4 1611
對於 30% 的資料:n, m ≤ 10
對於 50% 的資料:n, m ≤ 50
對於 100% 的資料:n ≤ 200, m ≤ 100000, 操作 1 不超過 200 次,邊權不超過 10000
首先對於任意兩點最短路,我們可以首先\(o(n^3)\)預處理,然後\(o(1)\)查詢
但是刪除邊怎麼辦? 我們不可能在題目要求的複雜度下動態維護刪邊操作,那只能換一種思路了
倒著來做,我們首先預處理出來是在所有刪邊操作全部結束後的任意兩點最短路,那麼每次對於乙個刪邊操作,實際上變成了加邊,我們要用加的這條邊去更新其他點,因為已經確定是由新加進來的邊去更新其他點,所以我們可以省去floyed列舉斷電那一重迴圈,\(o(n^2)\)即可,在加上刪邊操作最多200個,總複雜度\(o(n^3)\)
注意:有坑點,題目說可以重複刪邊,所以我們要記錄一下一條邊是什麼時候最早被刪的,只有到那個時候才算真正加上這條邊
#include#define rg register
#define il inline
#define min(a,b) (a)<(b)?(a):(b)
#define max(a,b) (a)>(b)?(a):(b)
#define lol long long
#define in(i) (i=read())
using namespace std;
const lol n=210,m=1e5+10,inf=1e15;
lol read()
while(i>='0' && i<='9') ans=(ans<<1)+(ans<<3)+i-'0',i=getchar();
return ans*=f;
}lol n,m;
lol w[n][n],del[n][n],vis[n][n],ans[m];
struct aq t[m];
int main()
}for(lol k=1;k<=n;k++)
for(lol i=1;i<=n;i++)
for(lol j=1;j<=n;j++)
for(lol i=m;i>=1;i--) }}
}for(lol i=1;i<=m;i++)
}
最短路 旅程
題目描述 您曾經帶領著我,穿過我的白天的擁擠不堪的旅程,而到達了我的黃昏的孤寂之境。在通宵的寂靜裡,我等待著它的意義。神即將帶領一些人去他們的孤寂之境,由於這個世界的不穩定,地點之間的有向道路會不定期地毀壞,出於工作準備,神想知道在某些道路毀壞之後某兩點之間的最短路。就是給定乙個有向圖,現有兩個操作...
紀中模擬賽 最短路線
某城市的街道是乙個很規整的矩形網格 見下圖 有m條南北向的縱街,n 条東 西向的橫街。現要從西南角的a 走到東北角的b,最短的走法共有多少種?輸入輸入檔案sline.in,一行,兩個數m,n,其中 2 首先,很多人沒看題目的人都應該會覺得這是最短路 其實並不是 我的解法就是 找規律,壓位高精遞推 記...
NOI模擬 最短路
內網傳送門 由於求最短路,邊權為1 11,那麼考慮在bfs bfsbf s樹上dpdp dp,類似於模擬bfs bfsbf s樹的生成過程。用f i j f i j f i j 表示當前的bfs bfsbf s樹上一共有i ii個點,最後一層有j jj個點的狀態的概率 i ii中包含了j jj 這裡...