網路流例題學習2

2022-02-02 08:42:41 字數 4038 閱讀 9855

有點長…分個p好了

人民群眾喜聞樂見的網路流24題

①搭配飛行員

二分圖最大匹配裸題

如果要強行上最大流…那麼就s->左邊每乙個點連邊容量1,該連的邊連一下容量1,右邊每乙個點->t連邊容量1

#include #include 

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

int n,fst[233333],nxt[233333],vb[233333],m=0,match[233333

];void ad_dl(int a,int b)

void addl(int a,int

b) bool vis[233333

];bool find(int

x) }

return0;

}#define fo(x)

intmain()

printf("%d

",ans);

}

#include #include 

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define sz 233333

int n,m=1;typedef long

long

ll;int

fst[sz],nxt[sz],vb[sz],cap[sz];

void _ad_dl(int a,int b,int c)

void ad_dl(int a,int b,int c)

ints,t,q[sz],d[sz];

bool

bfs()

}return d[t]!=-1;}

int dfs(int x,int

f)

if(!ca) d[x]=-1

;

return

ca;}

#define inf 1000000000

intdinic()

//**********===以上均為模板**********===

#define fo(x)

intmain()

②太空飛行計畫

最大權閉合子圖的裸題

有向圖的閉合圖:閉合圖內任意點的任意後繼也一定還在閉合圖中。

(以上兩張圖截自2007《最小割模型在資訊學競賽中的應用》amber)

那這題我們把每乙個儀器的點權設為-費用,實驗點權設為收益,然後實驗->儀器加邊,這樣就是要求乙個點權最大的閉合子圖。

轉化成最小割:加乙個源匯,源->正權點容量為點權,負權點->匯容量為-點權,原來的邊容量為∞。然後只要選s割集的點就是最大權閉合子圖,最大權值就是正權之和-最大流。

最小割=最大流這不用說吧。最小割的方案對於最大流來說只要從s開始在殘餘網路上bfs,能bfs到的是乙個割集。

所以就是道大水題啦~

#include #include 

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define sz 233333

int n,m=1;typedef long

long

ll;int

fst[sz],nxt[sz],vb[sz],cap[sz];

void _ad_dl(int a,int b,int c)

void ad_dl(int a,int b,int c)

ints,t,q[sz],d[sz];

bool

bfs()

}return d[t]!=-1;}

int dfs(int x,int

f)

if(!ca) d[x]=-1

;

return

ca;}

#define inf 1000000000

intdinic()

//**********===以上均為模板**********===

int c[233333],p[233333

];char buf[2333333

];bool vis[2333333

];bool gj[2333333

];void

bfs_2()

}}#define fo(x)

intmain()

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

int ans=dinic(); bfs_2();

int f1=0

;

for(int i=1;i<=m;i++) if

(gj[i])

f1=0

; putchar(

10);

for(int i=1;i<=n;i++) if(gj[i+m])

putchar(

10);

printf(

"%d\n

",tot-ans);

}

這題輸入較為捉雞,然後去看std,get了乙個新函式叫ungetc,就是把乙個字元退回到輸入流…(╯‵□′)╯為什麼我原來不知道有這種神奇的函式

③最小路徑覆蓋問題

把乙個頂點拆成兩個,乙個入點,乙個出點,對於原圖每一條邊(i,j),就把i的出點連到j的入點,然後二分圖最大匹配,然後我們發現只要沿著匹配邊查詢到的都是乙個路徑上的點,輸出所有路徑就行。然後最小路徑覆蓋的條數就是頂點數-匹配數。

匈牙利的話輸方案暴力dfs即可。dinic的話比較蛋疼,不太好描述……參見程式

#include #include 

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define sz 666666

int n,m=1

,fst[sz],nxt[sz],vb[sz],cap[sz],s,t;

void _ad_dl(int a,int b,int c)

void ad_dl(int a,int b,int

c)int

d[sz],q[sz];

bool

bfs()

}return d[t]!=-1;}

int dfs(int x,int

f)

return

used;

}int

dinic()

#define fo(x)

intfrom[sz],st[sz],stn=0

;int

main()

for(int i=1;i<=n;i++) ad_dl(s,i,1), ad_dl(i+n,t,1

);

int ans=dinic();

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

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

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

putchar(

10);

}printf(

"%d\n

",n-ans);

}

網路流學習筆記(2)

最小費用最大流 在保證最大流的前提下,讓費用最小。我們有兩種思路 1.先保證流最大,再去找費用最小的。2.保證費用最小,去找最大流。通常情況下我們會選擇第二種。我們想一下最大流是怎麼做的,bfs分層圖然後dfs每次只找深度 1的去增廣。如果我們要保證最小費用呢?每次去找費用最小的增廣。我們可以spf...

網路流演算法 例題整理

dinic 無當前弧優化 void add int x,int y,int z int dfs int x,int sum return0 int bfs if dep t 0 return 1 else return0 int dinic return ans dinic 含當前弧優化 多了乙個c...

網路流 最小割(例題 黑手幫)

最小割 是乙個邊集,去掉其中的邊之後源點匯點無法再連通,且這個邊集的容量之和最小 最大流最小割定理 乙個網路中最大流量等於最小割中邊的容量之和,即最大流 最小割 證 而根據法二,容易得到最小割的求法 得到最大流後,沿殘量網路bfs,構建層次圖 走dfs建搜尋樹也行,反正把源點一邊打上標記就行了 由於...