51nod 1444 破壞道路

2021-08-19 11:37:52 字數 1611 閱讀 7965

在某乙個國家,那兒有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
思路:

先用bfs計算出任意兩點間的最短距離。再考慮去掉s1-t1和s2-t2的路徑重合部分。

#include #include #include #include #include using namespace std;

const int maxn = 3005;

int n, m;

int s1, t1, l1;

int s2, t2, l2;

vectorline[maxn];

int dis[maxn][maxn];

bool vis[maxn];

void bfs()

}} }}

int main ()

cin >> s1 >> t1 >> l1;

cin >> s2 >> t2 >> l2;

bfs();

int result = dis[s1][t1] + dis[s2][t2];

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

else

if (dis[t1][i] + dis[i][j] + dis[j][s1] <= l1 && dis[t2][i] + dis[i][j] + dis[j][s2] <= l2)

if (dis[s1][i] + dis[i][j] + dis[j][t1] <= l1 && dis[t2][i] + dis[i][j] + dis[j][s2] <= l2)

if (dis[t1][i] + dis[i][j] + dis[j][s1] <= l1 && dis[s2][i] + dis[i][j] + dis[j][t2] <= l2)

}} cout << m - result << endl; }

return 0;

}

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...