題目描述
某年,白國和委國之間的戰爭爆發了!
然而,在委國指揮官委兆的眼裡,白國人不堪一擊。現在他手上有一張白國的地圖,發現白國有 n 個據點,m 條無向道路,他們有各自的長度。於是他決定按一定順序破壞白國的一些據點,使得所有連線這些據點與其他據點的道路無法通行。同時,為了更有效率的攻城略地,也為了滿足委兆的成就感,他有時還想知道當前某兩個據點間的最短路徑長。請程式設計滿足他的要求。
輸入
第一行兩個正整數 n,m。
接下來 m 行,每行有三個數 a,b,v表示一條連線 a,b的無向邊。
接下來一行乙個正整數 q 。
接下來 q 行,每行是兩個數 「 1 a 」 或是三個數 「 2 a b 」 ,含義如題面所述。
輸出
對於每個「 2 a b 」 操作,輸出對應的結果。
若兩點不連通,輸出−1 。
樣例輸入
4 41 2 6
3 4 1
1 3 4
1 4 9
32 1 4
1 32 1 4
樣例輸出59
提示
對於 100%的資料 n≤200,m≤n∗(n−1)/2,q≤2×104,v≤1000保證所有的操作合法。
思路
將所有問題離線運算,在記錄問題時,先鎖定被標記的點,對每個問題,從最後計算到最前,並倒序解鎖標記點,每次解鎖對全圖進行更新
**實現
#pragma gcc optimize(3,"ofast","inline")
#include
using
namespace std;
typedef
long
long ll;
typedef
unsigned
long
long ull;
const
int n=
205;
const
int m=
50005
;const
int inf=
0x3f3f3f3f
;const ll linf=
0x3f3f3f3f3f3f3f3f
;const ull sed=31;
const ll mod=
10000019
;const
double eps=
1e-5
;const
double pi=
acos(-
1.0)
;typedef pair<
int,
int>p;
typedef pair<
double
,double
>pd;
template
<
class
t>
void
read
(t &x)
while
(ch>=
'0'&&ch<=
'9')
x=f?
-x:x;
return;}
ll mp[n]
[n];
int n,m,q;
p qus[m]
;bool vis[n]
;vectorans;
intmain()
read
(q);
for(
int i=
1;i<=q;i++
)else
}for
(int k=
1;k<=n;k++
)for
(int i=
1;i<=n;i++
)for
(int j=
1;j<=n;j++)if
(!vis[i]
&&!vis[j]
&&!vis[k]
) mp[i]
[j]=
min(mp[i]
[j],mp[i]
[k]+mp[k]
[j])
;for
(int len=q;len;len--
)else
for(
int i=
1;i<=n;i++
)for
(int j=
1;j<=n;j++)if
(!vis[i]
&&!vis[j]
) mp[i]
[j]=
min(mp[i]
[j],mp[i]
[u]+mp[u]
[j]);}
}for
(int i=ans.
size()
-1;i>=
0;i--
)return0;
}
Dijkstra求最短路 I(樸素演算法)
給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,所有邊權均為正值。請你求出1號點到n號點的最短距離,如果無法從1號點走到n號點,則輸出 1。輸入格式 第一行包含整數n和m。接下來m行每行包含三個整數x,y,z,表示存在一條從點x到點y的有向邊,邊長為z。輸出格式 輸出乙個整數,表示1號點到n號...
最短路徑演算法 最短路
在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?input 輸入包括多組資料。每組資料第一行是兩個整數n m n 100,m 10000 n...
最短路演算法
常用的最短路演算法有三種 disjkstra,floyd,ballman floyd 一 disjkstra演算法 dijkstra演算法要求圖上的權非負數。同樣使用於無向圖 html view plain copy include stdio.h hdu 2544 define maxsum 0x...