【模板】最大流模板(dinic)
題目描述
如題,給出一個網路圖,以及其源點和匯點,求出其網路最大流。
輸入輸出格式
輸入格式:
第一行包含四個正整數N、M、S、T,分別表示點的個數、有向邊的個數、源點序號、匯點序號。
接下來M行每行包含三個正整數ui、vi、wi,表示第i條有向邊從ui出發,到達vi,邊權為wi(即該邊最大流量為wi)
輸出格式:
一行,包含一個正整數,即為該網路的最大流。
輸入輸出樣例
輸入樣例#1:
4 5 4 3
4 2 30
4 3 20
2 3 20
2 1 30
1 3 40
輸出樣例#1:
50
說明
時空限制:1000ms,128M
資料規模:
對於30%的資料:N<=10,M<=25
對於70%的資料:N<=200,M<=1000
對於100%的資料:N<=10000,M<=100000
一堆註釋掉的中間輸出見證了腦殘錯誤的代價QAQ。。。
code:
//By Menteur_Hxy
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
int rd() {
int x=0,fla=1;
char c=' ';
while(c>'9' || c<'0') {if(c=='-') fla=-fla; c=getchar();}
while(c<='9'&&c>='0') x=x*10+c-'0',c=getchar();
// scanf("%d",&x);
return x*fla;
}
const int MAX=10010;
const int INF=1e9;
int n,m,s,t,cnt;
int maxflow;
int head[MAX],deep[MAX],cur[MAX];
struct edges{
int to,next,w;
};
edges edge[200010 ];
void add(int x,int y,int z) {
edge[++cnt].next=head[x];
edge[cnt].to=y;
edge[cnt].w=z;
head[x]=cnt;
// cout<<cnt<<" "<<edge[cnt].to<<" "<<edge[cnt].next<<" "<<edge[cnt].w<<endl;
}
queue <int> q;
bool bfs() {
memset(deep,0,sizeof deep);
deep[s]=1;
for(int i=1;i<=n;i++) cur[i]=head[i];//!!!
while(!q.empty()) q.pop();
q.push(s);
while(!q.empty()) {
int u=q.front(),v; q.pop();
for(int i=head[u];i!=-1;i=edge[i].next)
if(!deep[v=edge[i].to] && edge[i].w) {
deep[v]=deep[u]+1;
q.push(v);
}
}
// cout<<deep[t]<<endl;
// for(int i=1;i<=n;i++) cout<<deep[i]<<" ";
// cout<<endl;
return deep[t];
}
int dfs(int now,int flow) {
if(now==t) return flow;
for(int& i=cur[now];i!=-1;i=edge[i].next) {
int v=edge[i].to,di;
// if(v==t) cout<<edge[i].w<<endl;
if(deep[now]+1==deep[v] && edge[i].w
&& (di=dfs(v,min(flow,edge[i].w))) ) {
// if(v==t) cout<<edge[i].w<<endl;
edge[i].w-=di;
edge[i^1].w+=di;
return di;
}
}
return 0;
}
void dinic() {
while(bfs())
while(int di=dfs(s,INF))
maxflow+=di;
}
int main() {
n=rd(),m=rd(),s=rd(),t=rd();
cnt=-1;
memset(head,-1,sizeof head);
for(int i=1;i<=m;i++) {
int a=rd(),b=rd(),c=rd();
add(a,b,c);
add(b,a,0);
}
dinic();
printf("%lld",maxflow);
return 0;
}
相關推薦
【模板】最大流模板(dinic)
題目描述 如題,給出一個網路圖,以及其源點和匯點,求出其網路最大流。 輸入輸出格式 輸入格式: 第一行包含四個正整數N、M、S、T,分別表示點的個數、有向邊的個數、源點序號、匯點序號。 接下來M行每行包含三個正整數ui、vi、wi,表示第i條有向邊從u
P4722 【模板】最大流
P4722 【模板】最大流 加強版 / 預流推進 今日心血來潮,打算學習hlpp 然後學了一陣子。發現反向邊建錯了。容量並不是0.qwq 然後就荒廢了一晚上。 演算法流程的話。有時間補上 #include<cstdio> #include<algorithm> #incl
【USACO15DEC】最大流Max Flow(樹上差分)
聽了教練的考前須知 蒟蒻緊張的要死 只想做信心題 #include<bits/stdc++.h> #define N 50005 using namespace std; int n,k,tot,first[N]; struct Tree { int to,next; }edge[2*N
網路流之最大流演算法(EdmondsKarp)
求網路流有很多演算法,這幾天學習了兩種,記錄一下EK演算法。 首先是網路流中的一些定義: V表示整個圖中的所有結點的集合.E表示整個圖中所有邊的集合.G = (V,E) ,表示整個圖.s表示網路的源點
網路流入門之最大流問題(1)
changxv大佬說網路流非常萬能,幾乎可以解決所有與圖有關的題目(網路流的強悍!),這裡寫出部落格只是談談我自己的心得體會,幫助那些看到網路流望而卻步的同學們以及我自己有個大致瞭解。 概念: 在一張帶權圖G中,我們已知源點s與匯點t,假設我們要將水從s輸送到t,其間必然
圖的匹配問題與最大流問題(二)——最大流問題Ford-Fulkerson方法
本篇承接上一篇文章,主要講解最大流問題的Ford-Fulkerson解法。可是說這是一種方法,而不是演算法,因為它包含具有不同執行時間的幾種實現。該方法依賴於三種重要思想:殘留網路,增廣路徑和割。本文將會詳細介紹這些內容,下一篇文章我們提供一種該方法的Java實現。 在介紹
【最大流 模板 Dinic】POJ 1459 Power Network
Problem Description 給你n, np, nc, m。分別代表有n個點,其中np個是發電站,nc個是消費者,剩下n-np-nc個就是中轉站。接下來給你m條邊,每條邊格式(u,v)w。代表u點到v點這條線路最大能夠運輸w的電。最後給你np個
【最大流 模板題 EdmondsKarp】HDU
Problem Description 給你m,n分別代表m條邊,n個點。接下來給你m條邊,每條邊u,v,w。u->v流量的容量為w。有重邊 思路:模板題,所以給幾個模板 時間複雜度O(F*|E|),F 為最大流量,E 為邊的個數 Edmon
網絡流最大流模板(洛谷3376)——Dinic
pen crt const || div color ini 技術分享 消息 小道消息,據說NOIP 2017 的六個題是三位(前?)國家隊大神出的,所以難度很有可能賊高,並且可能出現網絡流,所以慌慌張張地來打了個Dinic 模板,但願汝佳所說“在大多數比賽
洛谷 P2740 [USACO4.2]草地排水Drainage Ditches (EK增廣路演算法求最大流模板)
題目:草地排水 思路:EK增廣路演算法求最大流模板 程式碼: #include<bits/stdc++.h> using namespace std; #define maxn
婚車1667(最大流模板題)
題目描述 航哥是個土豪,他想在讓城市佈滿他的婚車。但是城市的每條道路單位時間能通過的婚車是有限的,超出則會造成擁堵。他在1號點屯了足夠數量的車子,他想知道從城市1號點派出婚車去n號點迎接新娘,在買通交警只允許他的婚車在車道上行駛的條件下,足夠多時間之後,n號點單位時間內最多能容納多少量婚車。 輸
最大流模板 EK (鄰接表)
題目描述 如題,給出一個網路圖,以及其源點和匯點,求出其網路最大流。 輸入輸出格式 輸入格式: 第一行包含四個正整數N、M、S、T,分別表示點的個數、有向邊的個數、源點序號、匯點序號。 接下來M行每行包含三個正整數ui、vi、wi,表示第i條有向邊從ui出發,到
最大流模板(一)BFS
Drainage Ditches 參考部落格 用這篇部落格學習了一下bfs求解最大流,然後先做一下筆記。(以下均為筆者自己理解,有不對之處還望大佬指出) 首先,我們學習最大流就要先了解什麼是最大流。 最大流問題定義:管道網路中每條邊的最大通過能力(容量)是有限的,實際流量不超過容量。最
【圖割】最大流/最小割演算法詳解(Yuri Boykov and Vladimir Kolmogorov,2004 )
最大流/最小割(Max-Flow/Min-Cut)在解決計算機視覺中的能量方程最小化問題的強大,最早發現是Greig於1989年發表的文章:Exact Maximum A Posteriori Estimation for Binary Images。 最大流最小割演算法求解的能量方程,通常是基於圖結構
poj1273-----最大流基礎(最簡單的最大流!--模板題)
題意:下雨的時候約翰的田裡總是積水,積水把他種的三葉草給淹了,他於是做了若干排水溝,每條溝在起始處安置一個閥門來控制這條溝的最大排水量,現在給出溝的條數以及閥門的個數。並給出每條溝的最大排水量。約翰的田裡的積水處是閥門1,排出水的位置是最後一個閥門。求約翰在處理積水時的最大
網路流(最大流+模板)
一、網路流的基本概念 先來看一個例項。 現在想將一些物資從S運抵T,必須經過一些中轉站。連線中轉站的是公路,每條公路都有最大運載量。如下圖: 每條弧代表一條公路,弧上的數表示該公路的最大運載量。最多能將多少貨物從S運抵T? 這是一個典型的網路流模型。為了解答此題,我們
poj 2135 Farm Tour (最小費用最大流模板)
網路流的費用: 在實際應用中,與網路流有關的問題,不僅涉及流量,而且還有費用的因素。網路的每一條邊(v,w)除了給定容量cap(v,w)外,還定義了一個單位流量費用cost(v,w) 最小費用最大流問題 給定網路G,要求G的一個最大用流flow,使流的總費用最小。 求解MC
HDU 4280 ISAP+BFS 最大流 模板
plane nal spa mea ret pass pan efi tran Island Transport Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/O
最大流模板暫存
print != class div max for sizeof 最大流 sca 1、 1 #include<bits/stdc++.h> 2 using namespace std; 3 struct Edge{ 4 int
最大流模板
open nbsp spa += evel scanf stdio.h 分享 hide dinic 碼著 #include<stdio.h> #include<string.h> #include<iostream> using na