【网络流二十四题】搭配飞行员
题目
解析:
二分图最大匹配模板
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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· 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工具