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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

洛谷P3386-二分图最大匹配

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

可以用匈牙利跑,但是剛學完網絡流,就試著用dinic跑了一發
題目鏈接:洛谷P3386

#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <map> #include <queue> #include <functional> #include <vector> #include <stack> #include <set> #include <bitset> using namespace std; typedef long long ll; const int maxn=5000+50; const int inf=0x3f3f3f3f; const int MOD=998244353; const int HASH=131;int n, m, cnt;//點,邊,前向星計數 int head[maxn];//前向星 int level[maxn];//分層 int cur[maxn];//當前弧優化struct Edge {int to;ll val;int next; }edge[maxn*maxn];void add(int u,int v,int val) {edge[cnt].to=v;edge[cnt].val=val;edge[cnt].next=head[u];head[u]=cnt++; /*反向存邊,在原邊基礎上+1*/edge[cnt].to=u;edge[cnt].val=0;edge[cnt].next=head[v];head[v]=cnt++; }bool find_level(int s,int t)//源點和匯點,該bfs函數用來確定深度(層次) {queue<int> q;memset(level,0,sizeof(level));for(int i=1;i<=n;i++){cur[i]=head[i];}int u=s;level[u]=1;q.push(u);while(!q.empty()){u=q.front();q.pop();for(int i=head[u];~i;i=edge[i].next){int v=edge[i].to;ll val=edge[i].val;if(!level[v]&&val)//層次不為0且容量不為0{level[v]=level[u]+1;q.push(v);}}if(level[t])//如果t有分層則繼續下一步的處理{return true;}}return false; }ll updata(int u,ll u_val,int t)//dfs更新 {if(u==t){return u_val;}ll used=0;//使用多少容量for(int &i=cur[u];~i;i=edge[i].next)//弧優化,神奇{int v=edge[i].to;ll val=edge[i].val;if(level[v]==level[u]+1&&val)//如果是相鄰兩層且有剩余容量{ll tmp=updata(v,min(u_val-used,val),t);//dfs遞歸,找最小容量edge[i].val-=tmp;edge[i^1].val+=tmp;used+=tmp;if(used==u_val) return used;//達到最大值,本條增廣路搜索完畢}}if(used==0) level[u]=-1;//找不到增廣路,減枝,節點作廢return used; }ll Dinic(int s,int t) {ll ans=0;while(find_level(s,t)){ans+=updata(s,inf,t);}return ans; }void init() {cnt=0;memset(head,-1,sizeof(head)); }int main() {init();int c;cin>>n>>m>>c;for(int i=1;i<=c;i++){int u,v;cin>>u>>v;u++,v=n+v+1;add(u,v,1);}for(int i=1;i<=n;i++)add(1,i+1,1);n++;for(int i=1;i<=m;i++)add(n+i,n+m+1,1);int s=1,t=n+m+1;n=t;cout<<Dinic(s,t)<<endl;return 0; }

總結

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

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