網路流 最大流 ISAP 模板

2021-08-21 05:26:32 字數 2772 閱讀 5278

至於怎麼找到的呢 我才不會說是當初搜網路流乙個個都不理解然後翻到十幾頁點進去看到的

吶 貌似是 國立台灣師範大學 的** (這學校是不是這個名=-=繁體我不會認啊好尷尬)

前言——

首先不知道這是 isap 還是 sap......

作為乙個剛學網路流的蒟蒻——frocean 感覺這網路流真是個玄學的東西=-=

跟著標打模板 0分 0分 0分...... 然後發現建圖建反向邊權值要為0

然後 90分 90分 90分...... 一直tle乙個點 於是打上了讀入優化

依舊 90分 90分 90分...... 經過多模板融合推敲 求同存異 最後改動了一些 提交 得68ms/4.5mb

然後我那叫乙個開心啊 就差拉車載個體面的先生去東安市場 然後去那兒最好的飯攤上 吃熱燒餅夾爆羊肉了

之後繼續優化 開o2 得48ms/4.5mb 開心~

於是建議大家抄標後慢慢看 多抄幾次慢慢就理解了 而且網上那些dalao們都說這類題目重在建圖 不過理解一下還是比較好

概念什麼的麻煩不想搬 網上的概念還是比較正規的

個人認為 網路流的概念 只是跟你介紹構圖之類的而已 我認真地看來看去還是不會打(應該是我悟性問題吧)

而且由於悟性問題 有些地方還是不太清楚 =-= (但為什麼不清楚的地方都是關鍵的地方啊啊啊 ng)

**—— 題目依然是洛谷的模板 比較正常的**見下

#include #include using namespace std;

const int max = 100005;

struct edge edge[max << 1];//(下行) gap[x]=y 意為 此時第 x 層的節點有 y 個

//cur相當於first陣列 只是取next裡的數作新的first 從路中間開始走而不是頭

int first[max],gap[max],dep[max],cur[max];//first鄰接表機制

//gap和cur分別是斷層優化和當前弧優化 dep存點深度

int n,m,i,j,tot = 1;//本模板為了用異或修改反向邊權值 tot從1開始 即第一條邊存在edge[2]裡

//如果用+1找反向邊不用初始定義 但找邊會慢一些

void add(int x,int y,int z)//鄰接表備註打太多遍了不想打

int dfs(int p,int mx)

cur[p] = first[p];//還原邊(這子程式不是乙個for就完了的 沒看見子程式名字叫dfs麼

//for裡還有深搜呢) 防止退出某層程式後有些有用的邊沒搜到

if (!--gap[dep[p]]) dep[i] = n;//減去1單位的當前層數節點數量並判斷是否搜完

//因為下句(tip:本句和下句順序不能換 親測100分和0分)

++gap[++dep[p]];//(gap裡面)增加當前節點深度 方便其他更長的增廣路經過他

//(gap外面)增加當前節點所在的層數的點的數量 因為上句

return mxflow;//返回當前增廣路的最大流

}int main()

tot = 0;//懶得定義新變數直接用tot ↓(這是箭頭)<---tot是用來存每次找到增廣路的值的

gap[0] = n;//所有節點的深度初始為0 ↓(箭頭是上行的)<----(這個箭頭是本行的)n表示節點個數

for ( ; dep[i] < n ; tot += dfs(i,1 << 30));

/*此處可不取1<<30 只要取比最大流大的數就好 但99%的時候你不知道最大流是多少

while (dep[i] < n) tot += dfs(i,1 << 30);*///本行與上行等價

//用來找深(長)度一樣的增廣路 然後長度遞增

printf("%d\n",tot);//當機立斷的輸出

return 0;//逢考必備的結尾

}

其實sap挺短的呢=w=就是要記的細節多

好了說了這麼多模板那我們來做一道普通的isap 有亂評分的嫌疑呢......

其實就多加了個最基礎的建邊而已 然後直接isap爆算即可

圖太稠了搞得isap速度都提不上來 =-= **見下

#include #define n 205

struct edge e[n * n];

int first[n],gap[n],cur[n],dep[n],tot = 1;

int kind1[n],kind2[n],hp1[n],hp2[n],more1,more2;

inline int min(int x,int y)

inline int r()

int n = r(),m = r(),s = n << 1 | 1,t = s + 1;

inline int re()

}inline void add(int x,int y,int z)

int dfs(int p,int mx)

cur[p] = first[p];

if (!--gap[dep[p]]) dep[s] = (n + 1) << 1;

++gap[++dep[p]];

return mxflow;

}int main()

tot = 0,gap[0] = (n + 1) << 1;

for ( ; dep[s] < (n + 1) << 1 ; tot += dfs(s,1 << 30));

printf("%d\n",tot < m ? tot : m);

return 0;

}

模板 網路最大流ISAP

模板 網路最大流isap 建反邊從t到s,bfs跑記錄每個點所在層,gap記錄每層的點數 include using namespace std typedef long long ll const ll max n 1e6 const ll max m 1e6 const ll max e max...

最大流 ISAP 模板

isap演算法還不懂的戳這裡 最大流入門題傳送門 poj 1273 drainage ditches 下面是isap 當前弧優化 gap優化的 include include include define clear a,x memset a,x,sizeof a define copy a,b m...

模板 最大流模板(ISAP)

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