1. 程式人生 > >【模板】最大流模板(dinic)

【模板】最大流模板(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

USACO15DECMax 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實現。 在介紹

模板 DinicPOJ 1459 Power Network

Problem Description 給你n, np, nc, m。分別代表有n個點,其中np個是發電站,nc個是消費者,剩下n-np-nc個就是中轉站。接下來給你m條邊,每條邊格式(u,v)w。代表u點到v點這條線路最大能夠運輸w的電。最後給你np個

模板題 EdmondsKarpHDU

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