農夫約翰知道每一條排水溝每分鐘可以流過的水量,和排水系統的準確布局(起點為水潭而終點為小溪的一張網)。需要注意的是,有些時候從一處到另一處不只有一條排水溝。
根據這些資訊,計算從水潭排水到小溪的最大流量。對於給出的每條排水溝,雨水只能沿著乙個方向流動,注意可能會出現雨水環形流動的情形。
第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)是這條排水溝的最大容量。
輸出乙個整數,即排水的最大流量。
//下面是樣例輸入
5 41 2 40
1 4 20
2 4 20
2 3 30
3 4 10
//樣例輸出
50
這個是我學習最大流演算法時,看到有部落格說這個是個入門題目,確實很基礎。
具體的最大流講解就不說了,推薦看這個部落格網路流入門之最大流演算法(增廣路演算法 由ford-fulkerson到edmonds-karp到dinic) 包看懂,確實講的不錯,尤其是他的**實現是那種最基本的形式。
下面的**兩個版本,乙個是基於他的進行了更改,另乙個是看的《演算法競賽入門經典(第二版)》368
頁的實現**,更加的高階吧。
//我的ek寫法。。。建議鄰接矩陣
//題目:洛谷p2740 草地排水
#includeusing namespace std;
const int inf=0x3f3f3f3f;
int m,n,cap[205][205],pre[205],flow[205][205];
int vis[205];
bool bfs(int s,int t)}}
return false;
}int max_flow(int s,int t)
for(int i=t;i!=s;i=pre[i])
ans+=vis[t]; //這是乙個結論 記住就行
}return ans;
}int main()
cout<#include#include#include#includeusing namespace std;
const int inf=0x3f3f3f3f;
const int maxn=300;
struct edge
};vectoredges;
vectorg[maxn];//鄰接表,g[i][j],表示結點i的第j條邊在edges[j]中。
int vis[maxn], pre[maxn], cap[205][205];//pre用來記錄路徑
int n, m;
void init()
inline void addedge(int from, int to, int cap) //這裡使用了inline函式,一定條件下可以減少執行時間
bool bfs(int s, int t)
} if(vis[t]) return true;
} return false;
}int maxflow(int s, int t)
flow += vis[t];
} return flow;
}int main()
for(int i=1; i<=n; i++) }
printf("%d\n", maxflow(1, n));
return 0;
}
洛谷P3128 最大流
本題當然可以用樹剖解決,而且是樹剖的模板題。但是對於本題來說,有一種更巧妙的辦法 樹上差分 類似於普通的差分,我們對於題目中的每一條路線i j,把它拆成i lca i,j j.然後將i點 j點的權值加一,將lca i,j 的權值減二 乍看起來沒什麼毛病,但是仔細想想,對lca i,j 的子樹進行字首...
洛谷 P4722 最大流最快模板
題意 直接給出網路流建圖資訊,求最大流 一般的dinic演算法和isap演算法複雜度為o n 2m 此題有專門資料會卡這兩個演算法。因此一種複雜度上界在常用最大流演算法中最優的最高標號預留推進演算法 又叫hlpphlpp 其上界為o n 2 sqrt m 並且在經過優化後這種演算法在資料隨機的情況下...
洛谷P3376 模板 網路最大流
如題,給出乙個網路圖,以及其源點和匯點,求出其網路最大流。輸入格式 第一行包含四個正整數n m s t,分別表示點的個數 有向邊的個數 源點序號 匯點序號。接下來m行每行包含三個正整數ui vi wi,表示第i條有向邊從ui出發,到達vi,邊權為wi 即該邊最大流量為wi 輸出格式 一行,包含乙個正...