在乙個農場裡有n塊田地。某天下午,有一群牛在田地裡吃草,他們分散在農場的諸多田地上,農場由m條無向的路連線,每條路有不同的長度。
突然,天降大雨,奶牛們非常混亂,想要快點去躲雨。已知每個田地都建立有乙個牛棚,但是每個牛棚只能容納一定數量的牛躲雨,如果超過這個數量,那多出的牛只能去別的田地躲雨。奶牛們每移動1的距離花費1時間,奶牛們想知道它們全部都躲進牛棚,最少需要多少時間。(即最後一頭奶牛最少要花多久才能躲進牛棚)。
第一行輸入兩個整數n,m。n表示田地塊數,m表示路徑數。
接下來n行,每行兩個整數s,p,分別表示該田地現在有幾頭牛以及該田地的牛棚最多可以容納多少牛。
接下來m行,每行3個整數a,b,c,表示存在一條路徑連線a,b,並且它的長度為c。
乙個整數表示所有奶牛全都躲進牛棚所用的最少時間。如果無法使全部奶牛都躲進牛棚,輸出-1。
3 4
7 2
0 4
2 6
1 2 40
3 2 70
2 3 90
1 3 120
110
1號點的兩隻牛直接躲進1號牛棚,剩下的5只中,4只跑去2號點,還有乙隻從1->2->3,3號點的2只牛也直接躲進去,這樣最慢的牛花費的時間是110。
網路流,首先floyed跑出每兩個農場間的最短路
考慮二分答案,每次只把路徑長度小與二分的答案的邊構圖
網路流判斷是否滿流即可,注意開long long
# include
# define il inline
# define rg register
# define fill(a, b) memset(a, b, sizeof(a))
# define copy(a, b) memcpy(a, b, sizeof(a))
using
namespace
std;
typedef
long
long ll;
const
int _(410), __(4e5 + 10);
const ll inf(1e18);
il ll read()
# define int ll
int n, m, num, w[__], fst[_], nxt[__], to[__], cnt, s[_], p[_];
int s, t, lev[_], cur[_], max_flow, ans, dis[_][_];
queue
q;il void add(rg int u, rg int v, rg int f)
il int dfs(rg int u, rg int maxf)
return ret;
}il bool bfs()
}return lev[t];
}il bool check(rg int lim)
# undef int
int main(rg int argc, rg char* argv)
for(rg int k = 1; k <= n; k++)
for(rg int i = 1; i <= n; i++)
for(rg int j = 1; j <= n; j++)
dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
rg int l = 0, r = inf, ans = -1;
while(l <= r)
printf("%lld\n", ans);
return
0;}
luogu P2402 奶牛隱藏
題目傳送門 題意 有n個點,m條邊,每乙個點一開始都有b1i頭奶牛,並且都可以容納b2i頭奶牛,但是b1i有可能大於b2i,因此奶牛需要遷徙,遷徙的時間為路程的長度。求最小的時間,若無法完成,輸出 1。思路 容易想到最短路floyd,因為可以與處理出從i點到j點的最短路 即時間花費 然後發現時間好像...
題解 奶牛隱藏
可以想到把奶牛當做水流,從最初奶牛在的節點,流到他最後停下的節點。但是時間不容易在圖上體現出來,考慮二分這個時間 這是網路流常見套路 然後判定在這個時間內,所有奶牛能否流到匯點。對於建圖,首先是對源點向每個點建一條邊,容量為這個點初始的奶牛數,每個點向匯點連一條邊,容量為這個點最多容納奶牛的數量。至...
Luogu 2986 偉大的奶牛聚集
題目描述 bessie正在計畫一年一度的奶牛大集會,來自全國各地的奶牛將來參加這一次集會。當然,她會選擇最方便的地點來舉辦這次集會。每個奶牛居住在 n 1 n 100,000 個農場中的乙個,這些農場由n 1條道路連線,並且從任意乙個農場都能夠到達另外乙個農場。道路i連線農場a i和b i 1 a ...