有點長…分個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這題輸入較為捉雞,然後去看std,get了乙個新函式叫ungetc,就是把乙個字元退回到輸入流…(╯‵□′)╯為什麼我原來不知道有這種神奇的函式#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);
}
③最小路徑覆蓋問題
把乙個頂點拆成兩個,乙個入點,乙個出點,對於原圖每一條邊(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建搜尋樹也行,反正把源點一邊打上標記就行了 由於...