RT
二分图匹配
#include<bits/stdc++.h>
#define maxn 100001
using namespace std;
int n,m,s,t;
struct Edge{
int from,to;
long long cap,flow;
};
vector<Edge> edges;
vector<int> G[maxn];
bool vis[maxn];
int cur[maxn];
int w[maxn];
void init()
{
edges.clear();
for(int i=0;i<100001;i++) G[i].clear();
}
void ins(int from,int to,long long w)
{
edges.push_back((Edge){from,to,w,0});
edges.push_back((Edge){to,from,0,0});
int t=edges.size();
G[from].push_back(t-2);
G[to].push_back(t-1);
}
bool bfs()
{
memset(vis,0,sizeof(vis));
queue<int> q;
q.push(s);
vis[s]=true;
w[s]=0;
while(!q.empty())
{
int p=q.front();q.pop();
for(int i=0;i<G[p].size();i++)
{
Edge& e=edges[G[p][i]];
if(!vis[e.to]&&e.cap>e.flow)
{
q.push(e.to);
w[e.to]=w[p]+1;
vis[e.to]=true;
}
}
}
return vis[t];
}
long long dfs(int p,long long a)
{
if(p==t||a==0) return a;
long long f,flow=0;
for(int& i=cur[p];i<G[p].size();i++)
{
Edge& e=edges[G[p][i]];
if(w[e.to]==w[p]+1&&(f=dfs(e.to,min(a,e.cap-e.flow)))>0)
{
e.flow+=f;
flow+=f;
a-=f;
edges[G[p][i]^1].flow-=f;
if(a==0) break;
}
}
return flow;
}
long long maxflow()
{
long long flow=0;
while(bfs())
{
memset(cur,0,sizeof(cur));
flow+=dfs(s,maxn*maxn);
}
return flow;
}
int main()
{
int u,v,k;
long long w;
cin>>n>>k>>m;
s=1;
for(int i=1;i<=n;i++) ins(1,i,1);
for(int i=n+1;i<=n+k;i++) ins(i,n+k+1,1);
for(int i=0;i<m;i++)
{
cin>>u>>v;
ins(u,v+n,1);
}
t=n+k+1;cout<<maxflow();
return 0;
cout<<maxflow();
return 0;
}
总是WA掉两个点