关于ABC的F
  • 板块学术版
  • 楼主cmll02
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/6/13 21:45
  • 上次更新2023/11/4 21:54:59
查看原帖
关于ABC的F
171487
cmll02楼主2021/6/13 21:45

网络流,不知道哪里炸了。

#include <stdio.h>
#include <string.h> 
#include <queue>
#define od(x) printf("%d",x)
#define odb(x) printf("%d ",x)
#define odl(x) printf("%d\n",x)
#define odp(x,y) printf("%d %d\n",x,y)
#define ol(x) puts("")
#define old(x) printf("%lld",x)
#define oldb(x) printf("%lld ",x)
#define oldl(x) printf("%lld\n",x)
#define oldp(x,y) printf("%lld %lld\n",x,y)
#define rg(x) for(int i=1;i<=(x);i++){
#define rj(j,y,x) for(int j=y;j<=(x);j++){
#define gr }
#define rrg(x) for(int i=0;i<(x);i++)
#define rdln(a) a[i]=read();
#define rdln0(a,x) rrg(x) rdln(a) gr
#define rdln1(a,x) rg(x) rdln(a) gr
inline int read()
{
	int num=0,f=1;char c=getchar();
	while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
	while(c>47&&c<58)num=num*10+(c^48),c=getchar();
	return num*f;
}
struct Edge{
	int v,w,nxt;
}e[2000005];
int h[1000005],cnt=2;
void addedge(int u,int v,int w)
{
	e[cnt]=(Edge){v,w,h[u]};
	h[u]=cnt++;
}
int now[1000005];
int vis[1005],dep[1000005];
int bfs(int s,int t)
{
	std::queue<int> q;
	memset(vis,0,sizeof(vis));
	vis[s]=1,dep[s]=0,now[s]=h[s];
	q.push(s);
	while(!q.empty())
	{
		int u=q.front();q.pop();
		for(int i=h[u];i;i=e[i].nxt)
		{
			int v=e[i].v;
			if(vis[v]||e[i].w==0)continue;
			dep[v]=dep[u]+1;
			now[v]=h[v];
			q.push(v);
			vis[v]=1;
			if(v==t)return 1;
		}
	}
	return 0;
}
int dfs(int u,int t,int f)
{
	if(u==t)return f;
	int l=f;
	for(int i=now[u];i;i=e[i].nxt)
	{
		now[u]=i;
		int v=e[i].v;
		if(e[i].w&&dep[v]==dep[u]+1)
		{
			int flow=dfs(v,t,e[i].w<l?e[i].w:l);
			e[i].w-=flow,e[i^1].w+=flow;
			l-=flow;
			if(l==0)break;
		}
	}
	return f-l;
}
inline void add(int u,int v,int w)
{
//	odp(u,v);
	addedge(u,v,w);
	addedge(v,u,0);
}
int G[105][105];
signed main()
{
	int n=read(),m=read(),k=read();
	int s=0,t=n+n+m+k+5;
	int q=max(n,m);
	n=m=q;
	rg(m)add(i+n+n,t,1);gr
	rg(n)add(i,i+n,1);gr
	rg(k)int a=read(),c=read(),b=read(),d=read();
	add(s,i+n+n+m,1);
	rj(j,a,b)add(i+n+n+m,j,1);
	rj(k,c,d)if(G[j][k]==0){G[j][k]=1;
	add(j+n,k+n+n,1);gr gr gr gr
	int ans=0;
	while(bfs(s,t))ans+=dfs(s,t,0x3f3f3f3f);
	printf("%d\n",ans);
	return 0;
}
2021/6/13 21:45
加载中...