日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

洛谷P3386:网络流之二分图匹配,最大流算法

發布時間:2023/12/14 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 洛谷P3386:网络流之二分图匹配,最大流算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


二分圖:我的理解是,對圖中的點集,可分為兩個集合U和V,使得兩個集合之間存在通路,且集合內部不存在通路。如上圖。
匹配:兩兩不含公共端點的邊集合M
最大匹配:邊數最多的匹配
完美匹配:最大匹配的匹配數滿足2*M=點的總數
二分圖匹配:二分圖中的匹配

實際上,可將二分圖最大匹配問題看作是最大流問題的特殊情況。

最大流方法解決二分圖匹配:
將原圖中的所有無向邊e改為有向邊,方向從U到V,容量為1.增加原點s和匯點t,從s向所有的頂點u∈U連一條容量為1的邊,從所有的頂點v∈V連一條容量為1的邊。
ff方法解決二分圖匹配(洛谷p3386):

class Main{static int maxn=1010;static ArrayList<edge> G[]=new ArrayList[2*maxn];static boolean vis[]=new boolean[2*maxn];static class edge{int to,cap,rev;public edge(int to,int cap,int rev) {this.to=to;this.cap=cap;this.rev=rev;}}static boolean dfs(int v,int t){if(v==t){return true;}vis[v]=true;int u,cap,rev;for(int i=0;i<G[v].size();i++){u=G[v].get(i).to;cap=G[v].get(i).cap;rev=G[v].get(i).rev;if(!vis[u]&&cap>0&&dfs(u,t)){G[u].get(rev).cap++;G[v].get(i).cap--;return true;}}return false;}static void add_edge(int v,int u){G[v].add(new edge(u,1,G[u].size()));G[u].add(new edge(v,0,G[v].size()-1));}static int max_flow(int s,int t){int res=0;for(;;){for(int i=0;i<2*maxn;i++) {vis[i]=false;}if(dfs(s,t)) {res++;}else {break;}}return res;}public static void main(String args[]){InputReader sc=new InputReader(System.in);PrintWriter out =new PrintWriter(System.out);int n=sc.nextInt();int m=sc.nextInt();int e=sc.nextInt();for(int i=1;i<=n+m+10;i++) {G[i]=new ArrayList<>();}int u,v;for(int i=0;i<e;i++) {u=sc.nextInt();v=sc.nextInt();if(v<=m&&u<=n) {add_edge(u, v+n);}}int s=n+m+1;int t=s+1;G[s]=new ArrayList<edge>();G[t]=new ArrayList<edge>();for(int i=1;i<=n;i++) {add_edge(s, i);}for(int i=n+1;i<=n+m;i++) {add_edge(i, t);}out.println(max_flow(s,t));out.flush();out.close();} }

總結

以上是生活随笔為你收集整理的洛谷P3386:网络流之二分图匹配,最大流算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。