【网络流二十四题】搭配飞行员

题目

解析:

二分图最大匹配模板

code:

#include <bits/stdc++.h>
using namespace std;

const int Maxn=105;
const int Maxm=3000;
const int inf=1e9;
int n,m,size=-1,s,t,ans;
int first[Maxn],dep[Maxn],tmp[Maxn];
struct shu{int to,next,len;}edge[Maxm<<2];

inline void build(int x,int y,int z)
{
	edge[++size].next=first[x],first[x]=size,edge[size].to=y,edge[size].len=z;
}

inline void init()
{
	int x,y;
	scanf("%d%d",&n,&m),s=0,t=n+1;
	memset(first,-1,sizeof(first));
	for(int i=1;i<=m;i++) build(s,i,1),build(i,s,0);
	for(int i=m+1;i<=n;i++) build(i,t,1),build(t,i,0);
	while(scanf("%d",&x)!=EOF)
	{
	  scanf("%d",&y);
	  build(x,y,1),build(y,x,0);
	}
}

inline bool bfs()
{
	queue<int>q;
	for(int i=0;i<=n+1;i++) dep[i]=0;
	q.push(s),dep[s]=1;
	while(q.size())
	{
	  int p=q.front();q.pop();
	  for(int u=first[p];u!=-1;u=edge[u].next)
	  {
	  	int to=edge[u].to;
	  	if(dep[to] || !edge[u].len) continue;
	  	dep[to]=dep[p]+1,q.push(to);
	  	if(to==t) return 1;
	  }
	}
	return 0;
}

inline int dfs(int p,int flow)
{
	if(p==t) return flow;
	int sum=0;
	for(int &u=tmp[p];u!=-1;u=edge[u].next)
	{
	  int to=edge[u].to;
	  if(dep[to]!=dep[p]+1 || !edge[u].len) continue;
	  int minn=dfs(to,min(flow-sum,edge[u].len));
	  sum+=minn,edge[u].len-=minn,edge[u^1].len+=minn;
	  if(sum==flow) break;
	}
	return sum;
}

inline void solve()
{
	while(bfs())
	{
	  for(int i=0;i<=n+1;i++) tmp[i]=first[i];
	  ans+=dfs(s,inf);
	}
	cout<<ans;
}

int main()
{
	init();
	solve();
	return 0;
}
posted @   Tarjan_Zeng  阅读(40)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示