1. 程式人生 > >網路最大流演算法—最高標號預流推進HLPP

網路最大流演算法—最高標號預流推進HLPP

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
const int MAXN=2*1e3+10;
const int INF=1e8+10;
inline char nc()
{
    static char buf[MAXN],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1
,MAXN,stdin),p1==p2)?EOF:*p1++; } inline int read() { char c=nc();int x=0,f=1; while(c<'0'||c>'9'){if(c=='-')f=-1;c=nc();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=nc();} return x*f; } int N,M,S,T; int H[MAXN];//每個節點的高度 int F[MAXN];//每個節點可以流出的流量 int gap[MAXN];//每個高度的數量
struct node { int u,v,flow,nxt; }edge[MAXN]; int head[MAXN]; int num=0;//注意這裡num必須從0開始 inline void add_edge(int x,int y,int z) { edge[num].u=x; edge[num].v=y; edge[num].flow=z; edge[num].nxt=head[x]; head[x]=num++; } inline void AddEdge(int x,int y,int z) { add_edge(x,y,z); add_edge(y,x,
0);//注意這裡別忘了加反向邊 } struct comp { int pos,h; comp(int pos=0,int h=0):pos(pos),h(h) {} inline bool operator < (const comp &a) const {return h<a.h;} }; priority_queue<comp>q; bool Work(int u,int v,int id) { int val=min(F[u],edge[id].flow); edge[id].flow-=val;edge[id^1].flow+=val; F[u]-=val;F[v]+=val; return val; } inline int HLPP() { H[S]=N;F[S]=INF;q.push(comp(S,H[S])); while(q.size()!=0) { int p=q.top().pos;q.pop(); if(!F[p]) continue; for(int i=head[p];i!=-1;i=edge[i].nxt) if( (p==S||H[edge[i].v]+1==H[p]) && Work(p,edge[i].v,i) && edge[i].v!=S && edge[i].v!=T) q.push( comp(edge[i].v,H[edge[i].v]) ); if(p!=S && p!=T && F[p]) { if( (--gap[ H[p] ])==0 )//該高度不存在 { for(int i=1;i<=N;i++) if( H[p]<H[i]&&H[i]<=N && p!=S && p!=T ) H[i]=N+1;//設定為不可訪問 } ++gap[ ++H[p] ];//高度+1 q.push( comp(p,H[p]) ); } } return F[T]; } int main() { #ifdef WIN32 freopen("a.in","r",stdin); #else #endif memset(head,-1,sizeof(head)); N=read(),M=read(),S=read(),T=read(); for(int i=1;i<=M;i++) { int x=read(),y=read(),z=read(); AddEdge(x,y,z); } printf("%d", HLPP() ); return 0; }

相關推薦

網路演算法最高標號推進HLPP

#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<queue> using namespace std; const int

網路 最高標號推進演算法(HLPP) [未完]

等等我的貌似是一般版的=-=不快啊 好煩還是得補 HLPP 從入門到服毒 兩道題目 讓你感受希望及其之後的絕望~~ 前提知識大概有 網路流 + 一般預流推進演算法 && 堆 掌握概念即可 (好吧其實之後也有提到一些) 前言:         以前學的東

網路中一般增廣路演算法標號法)

網路最大流主要有兩大類求解方法:增廣路演算法和預流推進演算法 一般增廣路演算法:主要分為初始流為零流和初始流為非零流的情況!後者在標號的時候注意一條邊是正向連線還是反向連線;若是反向的連線,那麼在調整的時候是減去,若為正向那麼在調整的時候是加上!   這裡就poj1149

網路-ISAP演算法詳解與模板

ISAP演算法 ISAP(Improved Shortest Augumenting Path)演算法是改進版的SAP演算法,如果對效率要求很高的時候,可以用該演算法。 (1)概述:演算法基於這樣的一個事實:每次增廣之後,任意結點到匯點(在殘餘網路中)的最短距離都不會

網路 - 從入門開始,詳細講到實用易懂的 Dinic 演算法

2019-01-02 更新 理解網路 一張網路,是一張帶權有向圖。比喻成輸水系統可能好理解—— 源頭是大水庫,想輸出多少就輸出多少。 但是,想要輸出到目的地,需要經過中轉點。中轉點不產生新流量、也不私吞;接受多少流量,就同時輸出多少流量。 點與點之間管道的容量(可以理解為水流量限制;注意“流量”指單

網路演算法—EK演算法

#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<queue> using namespace std; const int

HDU 3549 Flow Problem 網路問題 EK、Dinic、ISAP三種演算法

Flow Problem Time Limit: 5000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 8218    Accepted

網路演算法之Ford_Fullkerson方法,EK演算法c++模板

該演算法最精華的部分是反向邊的理解, 即修改容量的時候為什麼反向邊加上該值,     c[pre[i]][i]-=_min;     c[i][pre[i]]+=_min;              在演算法導論中對求解最大流問題給出了一般性的解決方法,但並沒有涉

網路 Dinic演算法

# 前言 看到網上好多都用的鏈式前向星,就我在用 $vector$ 鄰接表…… # 定義 先來介紹一些相關的定義。(個人理解) ## 網路 一個網路是一張帶權的有向圖 $G=(V,E)$ ,其中每任意一條邊 $(u,v)$ 的權值稱為這條邊的容量 $c(u,v)$ 。若這條邊不存在,對應的容量就為 $0$ 。

【模板】網路

題目描述 如題,給出一個網路圖,以及其源點和匯點,求出其網路最大流。 輸入輸出格式 輸入格式: 第一行包含四個正整數N、M、S、T,分別表示點的個數、有向邊的個數、源點序號、匯點序號。 接下來M行每行包含三個正整數ui、vi、wi,表示第i條有向邊從ui出發,到達vi,邊權為wi

Drainage Ditches(網路)

Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. This means that the clover is covered by water for awhi

問題Flow Problem(網路)- HDU 3549

        網路最大流問題屬於演算法 裡面較難的問題,因為牽涉的概念比較多,這一篇可能需要你花比較多的時間去理解,除了看這個,最好能多參考別的書籍或者文章進行比較學習,不然可能容易產生理解的偏差。 &n

P3376 【模板】網路

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<cmath> #include<b

洛谷P3376 【模板】網路

題目描述 如題,給出一個網路圖,以及其源點和匯點,求出其網路最大流。 輸入輸出格式 輸入格式: 第一行包含四個正整數N、M、S、T,分別表示點的個數、有向邊的個數、源點序號、匯點序號。 接下來M行每行包含三個正整數ui、vi、wi,表示第i條有向邊從ui出發,到達vi,邊權為wi(即該邊最大流量為w

網路入門

因為經過$AB$這條邊的流量為$SA,AB,BT$的最小值,然後xjb分情況討論一下,%……&*()()*&……%¥)(大概要分個一二十種情況吧,然後發現都是對的,其實就是各邊之間的流量等效替代問題。。。) (adsbygoogle = window.adsbygoo

洛谷 P3376【模板】網路

題目描述 如題,給出一個網路圖,以及其源點和匯點,求出其網路最大流。 【題目分析】 網路流模板題目 (Dinic) 【程式碼】 #include <cst

洛谷 P3376 【模板】網路

題目描述如題,給出一個網路圖,以及其源點和匯點,求出其網路最大流。輸入輸出格式輸入格式:第一行包含四個正整數N、M、S、T,分別表示點的個數、有向邊的個數、源點序號、匯點序號。接下來M行每行包含三個正整數ui、vi、wi,表示第i條有向邊從ui出發,到達vi,邊權為wi(即該

[模板]-網路-Edmonds Krap

問題描述: 給出一個網路圖,以及其源點和匯點,求出其網路最大流。 程式碼: struct edge//鏈式前向星 { int to; int next; int w; }; edge e[200010];//邊 int head

HDU-1532(網路

Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. This means that the clover is covered by

【模板】網路 (Dinic)

題目描述 給出一個網路圖,以及其源點和匯點,求出其網路最大流。 輸入輸出格式 輸入格式: 第一行包含四個正整數N、M、S、T,分別表示點的個數、有向邊的個數、源點序號、匯點序號。 接下來M行每行包含三個正整數ui、vi、wi,表示第i條有向邊從