博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【网络流24题】飞行员配对方案问题 题解
阅读量:2305 次
发布时间:2019-05-09

本文共 1283 字,大约阅读时间需要 4 分钟。

题目大意: n n n 个男生和 m m m 个女生,给出若干组关系,每组形如 x , y x,y x,y,表示男生 x x x 可以和女生 y y y 配对,问最多能成全几对并输出一种方案。

题解

二分图最大匹配,由于数据范围很小,匈牙利算法和网络流都可以的。

代码如下:

#include 
#include
#include
using namespace std;#define maxn 10010int n,m,S,T,E=0;struct edge{
int x,y,z,next;};edge e[maxn<<1];int first[maxn],len=1;void buildroad(int x,int y,int z){
e[++len]=(edge){
x,y,z,first[x]}; first[x]=len;}int h[maxn],q[maxn],st,ed;bool bfs(){
memset(h,0,sizeof(h)); st=ed=1;q[st]=S;h[S]=1; while(st<=ed) {
int x=q[st++]; for(int i=first[x];i;i=e[i].next) if(!h[e[i].y]&&e[i].z)h[q[++ed]=e[i].y]=h[x]+1; } return h[T];}int dfs(int x,int flow){
if(x==T)return flow; int tt=0,p; for(int i=first[x];i;i=e[i].next) {
int y=e[i].y; if(h[y]==h[x]+1&&e[i].z) {
p=dfs(y,min(e[i].z,flow-tt));tt+=p; e[i].z-=p;e[i^1].z+=p; if(tt==flow)break; } } if(!tt)h[x]=0; return tt;}int main(){
scanf("%d %d",&n,&m);S=n+m+1,T=S+1; int x,y; while(scanf("%d %d",&x,&y),x!=-1) buildroad(x,y,1),buildroad(y,x,0),E++; for(int i=1;i<=n;i++)buildroad(S,i,1),buildroad(i,S,0); for(int i=1;i<=m;i++)buildroad(i+n,T,1),buildroad(T,i+n,0); int ans=0; while(bfs())ans+=dfs(S,999999999); printf("%d\n",ans); for(int i=2;i<=2*E;i+=2) if(!e[i].z)printf("%d %d\n",e[i].x,e[i].y);}

转载地址:http://ecnib.baihongyu.com/

你可能感兴趣的文章
Spring事务管理
查看>>
乐观锁-CAS
查看>>
Socket学习
查看>>
机器学习算法比较
查看>>
大杀器xgboost指南
查看>>
ubuntu14.04+hadoop2.6.2+hive1.1.1
查看>>
二叉查找树转双向链表JAVA实现
查看>>
包含min函数的栈JAVA实现
查看>>
Hive几种数据导入方式
查看>>
最大子数组
查看>>
在二叉树中找出和为某一值的所有路径
查看>>
二进制中1的个数
查看>>
数值的整数次方
查看>>
链表中倒数第k个结点
查看>>
单链表反转
查看>>
合并两个排序的链表
查看>>
树的子结构
查看>>
二叉树的层次遍历
查看>>
两个链表的第一个公共节点
查看>>
二叉树的深度
查看>>