求助一道最大流(会关注的)
查看原帖
求助一道最大流(会关注的)
189181
exit0楼主2021/6/22 21:45

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;
}
2021/6/22 21:45
加载中...