網路流複習

2022-10-06 11:18:12 字數 2749 閱讀 9335

模型轉化:原題求最小代價,則直接設割掉的是需要選擇的。若原題求最大收益,則設割掉的是不選擇的,最後用總和減去最小割就是答案。

1.3.1定義

1.3.2應用方法

給出的圖一般是乙個有向圖,乙個閉合圖可以看做是一些點具有相互依賴的關係。因此對於有依賴關係,並且題目可以轉化成給某些點賦權為正,某些點賦權為負的有依賴求最大權值和問題,考慮用最大閉合權圖。

1.3.3構造

在原圖的基礎上增加源點\(s\)和匯點\(t\);將原圖中的每條有向邊\(\in e\)替換成容量為\(c(u,v)=\infty\)的有向邊\(\in e\);增加連線源\(s\)到原圖的每個正點權\(v(w_v>0)\)的有向邊\(\in e^\),容量為\(c(s,v)=w_v\);增加連線源\(t\)到原圖的每個負點權\(v(w_v<0)\)的有向邊\(\in e^\),容量為\(c(s,v)=-w_v\)。建圖時對應的反向邊容量均為\(0\)。

最後的答案就等於原圖所有正點權的和減去最小割,即\(ans=\mathop\limits_}w_v-c[s,t]\)

由於原圖中的邊容量為無窮,因此不會出現在最小割中,因此最後的割邊一定是一組簡單割。即每條割邊都只和\(s\)關聯或\(t\)關聯。

1.4.1定義:

1.4.2 構造

解決方法是二分答案,假設當前二分的答案為\(g\),原圖的邊數為\(m\),那麼建圖方式如下:對原圖中的所有邊\(\in e\),建立容量為\(1\)的邊\(\in e\),其反向邊容量也為\(1\);建議源點\(s\)匯點\(t\),\(s\)向原圖中的每個點\(v\)連線容量為\(m\)的邊,反向邊容量為\(0\);原圖中每個點\(v\)向\(t\)連線正向容量為\(m+2g-degree[v]\),發現容量為\(0\)的邊。

void add(int u,int v,double c1,double c2)

void build(double g)

double dinic(double g)

int main()

; dg[a]++,dg[b]++;

}double l=0,r=m;

while(l+1e-80) l=mid;

else r=mid;

}dinic(l);

}

1.5.1定義

以上問題都可以用二分圖的最大匹配模型轉化解決。

1.5.2最小點權覆蓋集

1.5.3最大點權獨立集

輸入方案:對於原圖的每條邊,流量為反向邊的流量\(f\)加上正向變的容量下界\(down\)。

**:

struct edges

e[m];

void add(int u,int v,int down,int up)

int main()

int tot=0;

for(int u=1;u<=n;u++)

if(in[u]-out[u]>0) add(s,u,0,in[u]-out[u]) ,tot+=in[u]-out[u];

else if(out[u]-in[u]>0) add(i,t,0,out[u]-in[u]);

//if(a[u]>0) add(s,i,0,a[u]) ,tot+=a[u];

//else if(a[u]<0) add(i,t,0,-a[u]);

if(dinic()!=tot) cout<

**:struct edges

e[m];

void add(int u,int v,int f)

int main()

int sum=0;

for(int i=1;i<=n;i++)

if(a[i]>0) add(s,i,a[i]),sum+=a[i];

else if(a[i]<0) add(i,t,-a[i]);

add(t,s,inf);

if(dinic()!=sum) cout<

#include #include #include using namespace std;

const int n,m,inf;

int n,m,s,t,cnt;

int head[n],d[n],cur[n];

struct edges

e[m*2];

void add(int u,int v,int f)

bool bfs()

} }return false;

}int find(int u,int limit)

cout

const int n=5005,m=50005*2,inf=1e8;

int n,m,s,t,cnt;

int head[n],d[n],st[n],pre[n],incf[n];

struct edges

e[m];

void add(int u,int v,int f,int c)

bool spfa()}}

}return incf[t]>0;

}void ek(int &flow,int &cost)

}}int main()

int flow,cost;

ek(flow,cost);

cout參考鏈結

網路流建模方式總結

國家集訓隊胡泊濤最小割應用

網路流複習

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

網路流複習計畫

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

網路流複習計畫

以前一直沒有刻意去練習過網路流的建圖,相當於完全不會網路流。1 usaco4.2 草地排水drainage ditches 最大流 2 清理雪道 最小流 3 有源匯上下界最大流 有源匯上下界最大流模板題 4 有源匯上下界最小流 有源匯上下界最小流 5 bzoj3698 xww的難題 6 士兵占領 7...