複習了下網路流,自己手動實現了兩種增廣路網路流

2022-05-13 16:17:56 字數 1636 閱讀 6911

ff演算法,裸的貪心+反向弧

#include #include 

#include

#include

using

namespace

std;

struct

node

};//

為什麼在結構體裡面要加入反向邊這個屬性呢,因為我們用的是鄰接表

//雖然你立馬知道反向邊的起點,,但是你卻不知道你在這個起點的鍊錶的位置是多少,我們這裡可以記錄一下

const

int maxn=1005

;const

int inf=~(0u)>>1

;vector

g[maxn];int

s,t;

void add(int u,int v,int

cap)

bool

vis[maxn];

int dfs(int v,int t,int

f) }

}return0;

}int

maxflow()

return

flow;

}int

main()

printf(

"ans:%d\n

",maxflow());

return0;

}

dinic演算法,level和iter陣列的當前弧優化非常巧妙

#include #include 

#include

#include

#include

using

namespace

std;

struct

node

};const

int maxn=1005

;vector

g[maxn];

ints,t;

void add(int u,int v,int

cap)

bool vis[maxn];//

這個可以不要,level陣列可以起兩個作用,記錄層數和是否被訪問過,類似於dp陣列

intlevel[maxn],iter[maxn];

void

bfs()}}

//需要得到所有頂點的level資訊,一方面起vis的作用,另一方面起到轉移的作用

//而且考慮到可能同時存在多個最短增廣路

}int dfs(int v,int t,int

f) }

}return

0;//

這裡忘記return 0了...

}const

int inf=~0u>>1

;int

maxflow()

if(level[t]<0) return

flow;

memset(iter,

0,sizeof

(iter));

while((f=dfs(s,t,inf))>0) flow+=f;

}}int

main()

printf(

"ans:%d\n

",maxflow());

return0;

}

網路流複習

幾個月沒碰過網路流了,想她了,所以撿起來,這麼好的東西怎麼能不用?網路流是啥?網路流是給定乙個有向圖,每條邊有乙個容量,這個圖還有乙個起點叫源點,乙個終點叫匯點。把有向圖想象成有多條路徑的水流管道圖,每條邊的容量就是能經過該邊的最大水流的流量。最大流是啥?最大流就是從源點能流向匯點的最大流量和。增廣...

網路流複習

模型轉化 原題求最小代價,則直接設割掉的是需要選擇的。若原題求最大收益,則設割掉的是不選擇的,最後用總和減去最小割就是答案。1.3.1定義 1.3.2應用方法 給出的圖一般是乙個有向圖,乙個閉合圖可以看做是一些點具有相互依賴的關係。因此對於有依賴關係,並且題目可以轉化成給某些點賦權為正,某些點賦權為...

網路流複習計畫

既然是複習網路流,那就不會去做水題了吧233 a.bzoj3996 tjoi2015線性代數 看到題就被嚇壞了2333。線性代數根本沒看完好嗎?然後。md轉個模型就是網路流了 題目大意 給定乙個n n 的矩陣b 和乙個1 n 的行向量c 求乙個1 n 的01矩陣a 使 a b c at 最大 a b...