蒟蒻调了半小时,实在是不行了
评测记录:这里
代码:
#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<climits>
#include<cstring>
#define N 1005
#define M 2005
using namespace std;
struct g
{
int to,nxt,w;
}edge[M*2+1];
int cur[N+1],head[N+1],dep[N+1],cnt,n,m,e,s,t;
void inline add_edge(int u,int v,int w)
{
auto &val=edge[++cnt];
val.to=v;
val.w=w;
val.nxt=head[u];
head[u]=cnt;
}
void inline add_arc(int u,int v,int w)
{
add_edge(u,v,w);
add_edge(v,u,0);
}//加边
bool bfs()
{
memset(dep,0,sizeof(dep));
queue<int> q;
q.push(s);
dep[s]=1;
while(!q.empty())
{
int temp=q.front();
for(int i=head[temp];i;i=edge[i].nxt)
{
int &to=edge[i].to,&w=edge[i].w;
if(!dep[to] && w)
{
dep[to]=dep[temp]+1;
q.push(to);
}
}
q.pop();
}
if(dep[t]) return 1;
return 0;
}//图分层
int dfs(int now,int flow)
{
if(now==t)
{
return flow;
}
for(int &i=cur[now];i;i=edge[i].nxt)
{
int &to=edge[i].to,&w=edge[i].w;
if(w)
{
int f=dfs(to,min(flow,w));
if(f)
{
edge[i].w-=f;
edge[((i-1)^1)+1].w+=f;//因为我的边是按1~cnt编号的,
return f; //所以要减一再加一
}
}
}
return 0;
}
int dinic()
{
int ans=0;
while(bfs())
{
for(int i=0;i<=n+m+2;i++)
{
cur[i]=head[i];
}
while(int ret=dfs(s,INT_MAX))
{
ans+=ret;
}
}
return ans;
}//dinic主体
int main()
{
scanf("%d %d %d",&n,&m,&e);
s=0,t=m+n+1;//点按0~n+m+1编号
for(int i=1;i<=n;i++)
{
add_arc(s,i,1);
}
for(int i=1;i<=m;i++)
{
add_arc(n+i,t,1);
}
for(int i=1;i<=e;i++)
{
int u,v;
scanf("%d %d",&u,&v);
add_arc(u,n+v,1);
}//加边
int ret=dinic();
printf("%d",ret);
return 0;
}