51nod1444 破壞道路

2021-08-17 02:18:23 字數 1628 閱讀 1898

1444 破壞道路

codeforces

基準時間限制:1.5 秒 空間限制:131072 kb 分值: 80 

難度:5級演算法題

在某乙個國家,那兒有n個城市,他們通過m條雙向道路相連。城市從1到n編號。如果城市a和b通過一條道路直接相連,那麼他們之間的距離就是乙個小時。這個國家的道路網路可以允許你從任意乙個城市到達另外的城市。

現在你要破壞盡可能多的道路,但是要保證從城市s1到t1不超過l1小時,並且從城市s2到t2不超過l2小時。

輸出最多可以破壞的道路數目,如果沒有解,請輸出-1

input

單組測試資料。

第一行有兩個整數n,m(1 ≤ n ≤ 3000, n-1 ≤ m ≤ min(3000,n*(n-1)/2) )。

接下來m行,每行有兩個整數 ai, bi (1 ≤ ai, bi ≤ n, ai ≠ bi),表示ai和bi之間有一條道路。

輸入保證是乙個連通圖。

最後兩行每行有三個整數s1, t1, l1和 s2, t2, l2, (1 ≤ si, ti ≤ n, 0 ≤ li ≤ n)。

output

輸出乙個整數,表示最多可以破壞的道路數目,如果沒有解,輸出-1。
input示例

5 4

1 22 3

3 44 5

1 3 2

3 5 2

output示例

0
題解:討論區說的很清楚了。

為每條邊的長度都是1,所以可以 bfs 在 $o(n^2)$ 的時間內處理每兩點之間的最短路長度。

我們的目的是留下的邊越少越好。由於有兩條路徑,如果兩條路徑有重疊則可以減少留下的邊。$o(n^2)$ 列舉重疊路徑(i -> j),如果 dis[s1][i] + dis[j][t1] + dis[i][j] <= l1 && dis[s2][i] + dis[j][t2] + dis[i][j] <= l2 可以更新。要注意的是,如果dis[s1][i] + dis[j][t1] + dis[i][j] <= l1 && dia[s2][j] + dis[i][t2] + dis[i][j] <= l2 也可以更新,因為兩個s不一定總是連著重疊路徑的同一端點。

另外還要注意的是,兩條邊可以沒有重疊路徑,所以一開始ans要設為只保留兩條最短路的答案。

**:

#includeusing namespace std;

int n,m,e[100000],next[100000],head[100000],tot,q[100000],g[3001],f[3001][3001];

void build(int t,int k)

void bfs(int x) }}

}int main()

for(i=1;i<=n;i++)bfs(i);

scanf("%d%d%d%d%d%d",&s1,&t1,&l1,&s2,&t2,&l2);

if(f[s1][t1]>l1||f[s2][t2]>l2)

ans=m-f[s1][t1]-f[s2][t2];

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

printf("%d",ans);

}

51nod 1444 破壞道路

在某乙個國家,那兒有n個城市,他們通過m條雙向道路相連。城市從1到n編號。如果城市a和b通過一條道路直接相連,那麼他們之間的距離就是乙個小時。這個國家的道路網路可以允許你從任意乙個城市到達另外的城市。現在你要破壞盡可能多的道路,但是要保證從城市s1到t1不超過l1小時,並且從城市s2到t2不超過l2...

51nod 1444 破壞道路

在某乙個國家,那兒有n個城市,他們通過m條雙向道路相連。城市從1到n編號。如果城市a和b通過一條道路直接相連,那麼他們之間的距離就是乙個小時。這個國家的道路網路可以允許你從任意乙個城市到達另外的城市。現在你要破壞盡可能多的道路,但是要保證從城市s1到t1不超過l1小時,並且從城市s2到t2不超過l2...

51Nod1444 破壞道路

題目看這裡 也是非常套路的一道題 首先考慮,如果只有一組限制,那麼答案就是m l1 現在考慮加了一組限制的情況下有什麼影響 顯然,被兩段路徑重複覆蓋的那一部分會多減掉一次 那麼我們可以列舉這段路徑,讓後用dp來計算答案,注意因為是無權圖可以bfs o n 2 求出兩點之間最短路 pragma gcc...