51nod 1444 破壞道路

2021-09-29 02:23:00 字數 1729 閱讀 7756

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

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

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

輸入

單組測試資料。

第一行有兩個整數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)。

輸出

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

輸入樣例

5 41 2

2 33 4

4 51 3 2

3 5 2

輸出樣例

0題意:城市和道路組成的連通圖,破壞盡可能多的道路,但是要保證從城市s1到t1不超過l1小時,並且從城市s2到t2不超過l2小時

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

思路:先求出兩兩之間的最短路,再嘗試經過各個點的最短路,找出兩個邊之和最少的情況

ac**:

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int inf=

0x3f3f

;vector<

int>map1[

3001];

int s1,t1,l1,s2,t2,l2;

int dis[

5010][

5010];

int v[inf]

;int n,m;

void

spfa

(int x)}}

}return;}

intmain()

cin>>s1>>t1>>l1>>s2>>t2>>l2;

for(

int i=

1;i<=n;i++

)spfa

(i);

if(dis[s1]

[t1]

>l1||dis[s2]

[t2]

>l2)

int ans=dis[s1]

[t1]

+dis[s2]

[t2]

;for

(int i=

1;i<=n;i++)}

cout<}

反思:本來就是思路上這麼想的,但是看討論區都在強調重邊問題,很懵逼,看網上的題解思路也是強調重邊問題,懵了好一會,但是後來發現他的**跟我的思路都差不多,就順著寫了沒想到還過了,就在剛寫部落格的時候忽然明白了,其是圖的邊的權值都是1,最短路長度也是邊數,就是要保留的最少的邊,但是要除去兩個最短路中的重邊。我去,寫最短路的時候我竟然沒看出來,我真是個憨憨。。。

51nod1444 破壞道路

1444 破壞道路 codeforces 基準時間限制 1.5 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 在某乙個國家,那兒有n個城市,他們通過m條雙向道路相連。城市從1到n編號。如果城市a和b通過一條道路直接相連,那麼他們之間的距離就是乙個小時。這個國家的道路網路可以允許你...

51nod 1444 破壞道路

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

51Nod1444 破壞道路

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