二分图的最大匹配(模板)
传送门:https://www.luogu.org/problem/P3386
已经加入极其简单的当前弧优化
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m,bian,s,t; 4 int dep[6000001]; 5 int inque[6000001]; 6 int cur[6000001]; 7 int maxflow=0; 8 struct edge{ 9 int to,nxt,flow; 10 }e[6000001];int tot=-1; 11 int first[6000001]; 12 const int inf=0x3f3f3f3f; 13 inline int kd() 14 { 15 int x=0,f=1;char ch=getchar(); 16 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 17 while(ch>='0'&&ch<='9'){x=x*10+(ch^48);ch=getchar();} 18 return x*f; 19 } 20 inline void add_edge(int a,int b,int c) 21 { 22 e[++tot].to=b; 23 e[tot].flow=c; 24 e[tot].nxt=first[a]; 25 first[a]=tot; 26 } 27 bool bfs() 28 { 29 for(register int i=0;i<=n+m+2;i++)cur[i]=first[i],inque[i]=false,dep[i]=0x3f3f3f3f; 30 dep[s]=0; 31 queue<int>q; 32 q.push(s); 33 while(q.empty()==false) 34 { 35 int now=q.front(); 36 q.pop(); 37 inque[now]=false; 38 for(int i=first[now];i!=-1;i=e[i].nxt) 39 { 40 int to=e[i].to; 41 if(dep[now]+1<dep[to]&&e[i].flow!=0) 42 { 43 dep[to]=dep[now]+1; 44 if(inque[to]==false) 45 { 46 inque[to]=true; 47 q.push(to); 48 } 49 } 50 } 51 } 52 if(dep[t]==0x3f3f3f3f)return false; 53 return true; 54 } 55 int dfsl(int now,int nowflow) 56 { 57 int rlow=0; 58 if(now==t)return nowflow; 59 for(int i=cur[now];i!=-1;i=e[i].nxt) 60 { 61 cur[now]=i; 62 if(dep[now]+1==dep[e[i].to]&&e[i].flow!=0) 63 { 64 if(rlow=dfsl(e[i].to,min(nowflow,e[i].flow))) 65 { 66 e[i].flow-=rlow; 67 e[i^1].flow+=rlow; 68 return rlow; 69 } 70 } 71 } 72 return 0; 73 } 74 void dinic() 75 { 76 int lowflow; 77 while(bfs()){ 78 while(lowflow=dfsl(s,inf)){ 79 maxflow+=lowflow; 80 } 81 } 82 return; 83 } 84 int main() 85 { 86 memset(first,-1,sizeof(first)); 87 n=kd(),m=kd(),bian=kd(),s=0,t=m+n+1; 88 for(int i=1;i<=n;i++) 89 { 90 add_edge(s,i,1); 91 add_edge(i,s,0); 92 } 93 for(int i=1;i<=bian;i++) 94 { 95 int a=kd(),b=kd(); 96 if(a>n||b>m)continue; 97 add_edge(a,b+n,1); 98 add_edge(b+n,a,0); 99 } 100 for(int i=1;i<=m;i++) 101 { 102 add_edge(i+n,t,1); 103 add_edge(t,i+n,0); 104 } 105 dinic(); 106 cout<<maxflow<<endl; 107 }