最大流的最原型題目是給定乙個網路,問你從源點最多一次能流多少流到匯點。
這樣說有點不懂,我打個比方:給定乙個電路圖,有以下幾個特徵:
1.每條導線 \(i\) 有個每秒最大電流通過值 \(ci\) (你可以理解為過了這個值導線就燒了所以這條導線上的最大電流不能超過這個值)
2.對於串聯的電路,若a與b串聯,那麼這條串聯路每秒可通過的最大電流為\((min(ca,cb))\)
3.對於併聯的電路,若a與b併聯,那麼通過這條等價併聯電路的最大電流為\((ca + cb)\)
4.電流速度為\(inf\)
5.求導線聯通\(1s\)能到匯點的最大電流
如下題所示:
題目描述
汶川**發生時,四川**中學正在上課,一看**發生,老師們立刻帶領x名學生逃跑,整個學校可以抽象地看成乙個有向圖,圖中有n個點,m條邊。1號點為教室,n號點為安全地帶,每條邊都只能容納一定量的學生,超過樓就要倒塌,由於人數太多,校長決定讓同學們分成幾批逃生,只有第一批學生全部逃生完畢後,第二批學生才能從1號點出發逃生,現在請你幫校長算算,每批最多能運出多少個學生,x名學生分幾批才能運完。
輸入輸出格式
輸入格式:
第一行3個整數n,m,x(x<2^31,n<=200,m<=2000);以下m行,每行三個整數a,b,c(a1,a<>b,0描述一條邊,分別代表從a點到b點有一條邊,且可容納c名學生。
輸出格式:
兩個整數,分別表示每批最多能運出多少個學生,x名學生分幾批才能運完。如果無法到達目的地(n號點)則輸出「orz ni jinan saint cow!」
最大流的板題,我們採用dinic演算法(當前弧優化版本):
#include#include#include#include#include#define ll long long
using namespace std;
int rd()
while(c >= '0' && c <= '9')
return flag * out;
}const int maxn = 100019,inf = 1e9;;
int num,nr,nume;
int tot;
int s,t,maxflow;
int head[maxn],cur[maxn];//cur為當前弧優化
struct nodee[maxn << 2];
void add(int u,int v,int dis)
int d[maxn];
bool bfs()}}
return 0;
}int dinic(int u,int flow)
if(rest == 0)break;//配合當前弧優化
}return flow - rest;
}int main()
int flow = 0;
while(bfs())
if(maxflow == 0)
printf("%d ",maxflow);
if(tot % maxflow == 0)
printf("%d\n",tot / maxflow + 1);
return 0;
}
網路流類題目主要考察的並不是演算法的運用,而是對構建模型的理解,對此,在後續的部落格中會一一講解。 網路流 最大流
網路流 題記 網路流是最近講過的最迷演算法 網路流 network flows 是一種模擬水流的解決問題方法,與線性規劃密切相關。非常重視選手在網路流上的建模技巧,畫圖是非常關鍵的。1 最大流 問題引入 有n條溝渠,與水坑s t相連,匯聚成m個點,第i條溝渠的水流的流量為c i 每乙個點的流入量和流...
網路流(最大流)
我們圍繞一道題來講解吧 藍橋杯 演算法訓練 網路流裸題 首先,何為網路流最大流問題?可行流 對於每條路線 u,v 上給定乙個實數f u,v 滿足 0 f u,v c u,v 則稱f u,v 為路線 u,v 的流量。而對於一組具有源點和匯點,且總流出量 總流入量,則稱為網路中的一條可行流。拿例子來說 ...
網路流 最大流
dinic 最大流 head x 從0開始記 這樣便於找反向邊 異或即可 當前弧優化 include include include include include include include define ll long long define ull unsigned long long d...