luogu p2740 [usaco4.2]草地排水drainage ditches
題目背景
題目描述
農夫約翰知道每一條排水溝每分鐘可以流過的水量,和排水系統的準確布局(起點為水潭而終點為小溪的一張網)。需要注意的是,有些時候從一處到另一處不只有一條排水溝。
根據這些資訊,計算從水潭排水到小溪的最大流量。對於給出的每條排水溝,雨水只能沿著乙個方向流動,注意可能會出現雨水環形流動的情形。
輸入輸出格式
輸入格式:
第1行: 兩個用空格分開的整數n (0 <= n <= 200) 和 m (2 <= m <= 200)。n是農夫john已經挖好的排水溝的數量,m是排水溝交叉點的數量。交點1是水潭,交點m是小溪。
第二行到第n+1行: 每行有三個整數,si, ei, 和 ci。si 和 ei (1 <= si, ei <= m) 指明排水溝兩端的交點,雨水從si 流向ei。ci (0 <= ci <= 10,000,000)是這條排水溝的最大容量。
輸出格式:
輸出乙個整數,即排水的最大流量。
輸入輸出樣例
輸入樣例#1:
5 4輸出樣例#1: 題意簡化:給定乙個有n個點m條邊的圖,圖中的邊有以下屬性:1 2 40
1 4 20
2 4 20
2 3 30
3 4 10
兩個端點u(起點)和v(終點),和邊的容量w。有方向。現在要從原點1把一些物資運輸到終點n,每條邊在通過的物資數量大於w時就會粉碎(被刪除失效),求最多能把多少物資運送到終點?
思路
對於每個邊,我們把他的容量記為c(
u,v)
,實際運送的物品量叫流量,記為f(
u,v)
,剩下的可用容量叫殘量c(
u,v)
=c(u
,v)−
f(u,
v)那麼我們可以推知以下結論:f(
u,v)
和f(v,u)
中,最多有1個正數。且f(
u,v)
+f(v
,u)=
0 (斜對稱性)f(
u,v)
<=c(
u,v)
(容量限制)
對於除了起點和終點的結點u,∑(
u,v)
∈edg
ef(u
,v)=
0 (流量平衡)
演算法思想,就是從f(
all)
=0開始,在滿足上述三個性質的情況下增加流量。殘量網路中的任何一條從起點到終點的路徑都對應一條原圖中的增廣路。只要求出改路徑中的殘量最小值
d ,把對應邊的流量增加
d即可。當殘量網路裡沒有增廣路,則當前流就是最大流。
#include
#include
#include
#include
#include
#include
using
namespace
std;
const
int maxn=1000+10;
inline
void read(int &misaka)
while(ch>='0' && ch<='9')
misaka=ans*flag;
}struct e edge[maxn];
int head[maxn],cnt=0;
int n,m;
int ans=0,pf;
bool vis[maxn];
inline
void add(int u,int v,int w)
inline
bool dfs(int x,int f)
vis[x]=1;
for(int i=head[x]; ~i; i=edge[i].next) }}
return
false;
}int main()
while(dfs(1,100000000))
cout
0;}
C 用DFS 深度優先搜尋 求連通塊個數
圖描述的是一些個體之間的關係。與線性表和二叉樹不同的是 這些個體之間既不是前驅後繼的順序關係,也不是祖先後代的層次關係,而是錯綜複雜的網狀關係。和二叉樹的遍歷類似,圖也有dfs和bfs遍歷,由於dfs更容易編寫,一般用dfs找連通塊。下面用乙個例子說明。例題 輸入乙個m行n列的字元矩陣,統計字元 組...
廣度優先搜尋 深度優先搜尋
前言 這幾天複習圖論演算法,覺得bfs和dfs挺重要的,而且應用比較多,故記錄一下。廣度優先搜尋 有乙個有向圖如圖a 圖a廣度優先搜尋的策略是 從起始點開始遍歷其鄰接的節點,由此向外不斷擴散。1.假設我們以頂點0為原點進行搜尋,首先確定鄰接0的頂點集合s0 2.然後確定頂點1的集合s1 頂點2沒有鄰...
廣度優先搜尋,深度優先搜尋
深度優先搜尋 depth first search 簡稱dfs。最直觀的例子就是 走迷宮 廣度優先搜尋 每個頂點都要進出一遍佇列,每個邊也都會被訪問一次,所以 時間複雜度o v e 主要消耗記憶體的是visited prev陣列 queue佇列,所以 空間複雜度o v 深度優先搜尋 每條邊最多會被訪...