我只是来熟悉板子的,水题没啥好说
(请问一个step数组忘记清零,dfs正向边反向边加反的人是如何拿到50分的???)
#include<bits/stdc++.h>
const int N=500;
const int M=100000;
const int INF=0x3f3f3f3f;
using namespace std;
int n,p,q;
int s,t;
struct Edge
{
int to,next,cap;
}edge[M];
int first[N],tot=1;
inline void addedge(int u,int v,int c)
{
tot++;
edge[tot].to=v; edge[tot].next=first[u]; edge[tot].cap=c; first[u]=tot;
}
inline void Add(int u,int v,int c)
{
addedge(u,v,c);
addedge(v,u,0);
}
int step[N],cur[N];
inline bool bfs()
{
memset(step,0,sizeof(step));
queue <int> q;
q.push(s); step[s]=1;
while(!q.empty())
{
int now=q.front(); q.pop();
for(int u=first[now];u;u=edge[u].next)
{
int vis=edge[u].to;
if(!step[vis]&&edge[u].cap>0)
{
step[vis]=step[now]+1;
q.push(vis);
if(vis==t) return 1;
}
}
}
return 0;
}
inline int dfs(int now,int flow)
{
if(now==t||!flow) return flow;
int out=0;
for(int &u=cur[now];u;u=edge[u].next)
{
int vis=edge[u].to;
if(edge[u].cap&&step[vis]==step[now]+1)
{
int w=dfs(vis,min(flow,edge[u].cap));
if(!w) continue;
flow-=w; edge[u].cap-=w; edge[u^1].cap+=w; out+=w;
if(!flow) break;
}
}
return out;
}
void Dinic()
{
int maxflow=0;
while(bfs())
{
for(int i=0;i<=t;i++) cur[i]=first[i];
maxflow+=dfs(s,INF);
}
cout<<maxflow<<endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin>>n>>p>>q;
s=0; t=p+n*2+q+1;
for(int i=1;i<=p;i++) Add(s,i,1);
for(int i=p+1;i<=p+n;i++) Add(i,i+n,1);
for(int i=p+2*n+1;i<=p+2*n+q;i++) Add(i,t,1);
for(int i=1,x;i<=n;i++)
for(int j=1;j<=p;j++)
{
cin>>x;
if(x==1) Add(j,p+i,1);
}
for(int i=1,x;i<=n;i++)
for(int j=1;j<=p;j++)
{
cin>>x;
if(x==1) Add(i+n+p,p+2*n+j,1);
}
Dinic();
return 0;
}