P1231教辅的组成
除了第1、3、4个测试点之外其余测试点点输出都是0。
求指错(会关注的)。
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define int long long
#define N 90050
#define M 90050
using namespace std;
inline int read()
{
int ans=0;
char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
while(ch>='0'&&ch<='9')ans=(ans<<1)+(ans<<3)+(ch^48),ch=getchar();
return ans;
}
struct Edge{
int to;
int next;
int v;
}edge[M];
int head[N],cnt=1;
inline void add_Edge(int f,int t,int c)
{
cnt++;
edge[cnt].to=t;
edge[cnt].v=c;
edge[cnt].next=head[f];
head[f]=cnt;
}
int S,T;
int deep[N];
queue<int>qwq;
inline bool bfs()
{
memset(deep,0,sizeof(deep));
qwq.push(S);
deep[S]=1;
while(!qwq.empty())
{
int k=qwq.front();
qwq.pop();
for(int i=head[k];i;i=edge[i].next)
{
int t=edge[i].to;
if(!deep[t]&&edge[i].v)
{
deep[t]=deep[k]+1;
qwq.push(t);
}
}
}
return deep[T];
}
inline int dfs(int now,int flow)
{
if(now==T)return flow;
for(int i=head[now];i;i=edge[i].next)
{
int t=edge[i].to;
if(deep[t]==deep[now]+1&&edge[i].v)
{
long long ret=dfs(t,min(flow,edge[i].v));
if(ret>0)
{
edge[i].v-=ret;
edge[i^1].v+=ret;
return ret;
}
else deep[t]=0;
}
}
return 0;
}
int n,p,q,m1,m2,x,y;
signed main()
{
n=read(),p=read(),q=read();
for(int i=1;i<=p;i++)add_Edge(0,i,1),add_Edge(i,0,0);
m1=read();
for(int i=1;i<=m1;i++)
{
x=read(),y=read();
add_Edge(y,p+x,1),add_Edge(p+x,y,0);
}
for(int i=p+1;i<=p+n;i++)add_Edge(i,i+n,1),add_Edge(i+n,i,0);
m2=read();
for(int i=1;i<=m2;i++)
{
x=read(),y=read();
add_Edge(n+p+x,p+n+n+y,1),add_Edge(p+n+n+y,n+p+x,0);
}
for(int i=p+n+n+1;i<=p+n+n+q;i++)add_Edge(i,p+n+n+q+1,1),add_Edge(p+n+n+q+1,i,0);
S=0,T=p+n+n+q+1;
long long ans=0;
while(bfs())ans+=dfs(S,0x7fffffff);
cout<<ans;
return 0;
}