博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UOJ #78 二分图最大匹配
阅读量:5086 次
发布时间:2019-06-13

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

#78. 二分图最大匹配

从前一个和谐的班级,有 nl 个是男生,有 nr 个是女生。编号分别为 1,,nl 和 1,,nr

有若干个这样的条件:第 v 个男生和第 u 个女生愿意结为配偶。

请问这个班级里最多产生多少对配偶?

输入格式

第一行三个正整数,nl,nr,m

接下来 m 行,每行两个整数 v,u 表示第 v 个男生和第 u 个女生愿意结为配偶。保证 1vnl1unr,保证同一个条件不会出现两次。

输出格式

第一行一个整数,表示最多产生多少对配偶。

接下来一行 nl 个整数,描述一组最优方案。第 v 个整数表示 v 号男生的配偶的编号。如果 v 号男生没配偶请输出 0

样例一

input

2 2 31 11 22 1

output

22 1

explanation

1 号男生跟 2 号女生幸福地生活在了一起~

2 号男生跟 1 号女生幸福地生活在了一起~

样例二

input

2 2 21 12 1

output

11 0

explanation

班上一个女神一个女汉子,两个男生都去追女神。一种最优方案是:

1 号男生跟 1 号女生幸福地生活在了一起~

2 号男生孤独终生。= =||

限制与约定

1nl,nr5001m250000

时间限制1s

空间限制256MB

题解:先写网络流,跑的还挺快。

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #define PAU putchar(' ') 8 #define ENT putchar('\n') 9 using namespace std;10 const int maxn=100000+10,maxm=2000000+10,inf=-1u>>1;11 struct isap{12 struct ted{ int x,y,w;ted*nxt,*re;}adj[maxm],*fch[maxn],*cur[maxn],*ms;13 int gap[maxn],d[maxn],ret[maxn],n,S,T;14 void init(int n){memset(d,-1,sizeof(d));ms=adj;this->n=n;return;}15 void add(int x,int y,int w){16 *ms=(ted){x,y,w,fch[x],ms+1};fch[x]=ms++;17 *ms=(ted){y,x,0,fch[y],ms-1};fch[y]=ms++;18 return;19 }20 void bfs(){21 queue
Q;Q.push(T);d[T]=0;22 while(!Q.empty()){23 int x=Q.front();Q.pop();24 for(ted*e=fch[x];e;e=e->nxt){25 int v=e->y;if(d[v]<0)d[v]=d[x]+1,Q.push(v);26 }27 }return;28 }29 int mxflow(int S,int T){30 this->S=S;this->T=T;bfs();int flow=0,k=S;ted*e;31 for(int i=1;i<=n;i++)gap[d[i]]++,cur[i]=fch[i];32 while(d[S]
y)if(cur[i]->w
w,p=i;35 for(int i=S;i!=T;i=cur[i]->y)cur[i]->w-=mi,cur[i]->re->w+=mi;flow+=mi;k=p;36 }for(e=cur[k];e;e=e->nxt)if(e->w&&d[k]==d[e->y]+1)break;37 if(e){cur[k]=e;k=e->y;ret[e->y]=e->x;}38 else{ if(--gap[d[k]]==0)break;cur[k]=fch[k];int mi=n;39 for(ted*e=fch[k];e;e=e->nxt)if(e->w&&d[e->y]
y];40 d[k]=mi+1;gap[d[k]]++;if(k!=S)k=ret[k];41 }42 }return flow;43 }44 int print(int x){45 for(ted*e=fch[x];e;e=e->nxt)if(!e->w&&!((e-adj)&1))return e->y;return 0;46 }47 }sol;48 inline int read(){49 int x=0,sig=1;char ch=getchar();50 while(!isdigit(ch)){ if(ch=='-')sig=-1;ch=getchar();}51 while(isdigit(ch))x=10*x+ch-'0',ch=getchar();52 return x*=sig;53 }54 inline void write(int x){55 if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x;56 int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;57 for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return;58 }59 int n1,n2,m;60 void init(){61 n1=read();n2=read();m=read();sol.init(n1+n2+2);int x,y,w,S=n1+n2+1,T=n1+n2+2;62 for(int i=1;i<=n1;i++)sol.add(S,i,1);63 for(int i=n1+1;i

 

转载于:https://www.cnblogs.com/chxer/p/4676479.html

你可能感兴趣的文章
打开3389
查看>>
React学习记录
查看>>
nginx常见内部参数,错误总结
查看>>
对象与类
查看>>
《奸的好人2》财色战场----笔记
查看>>
BZOJ 1834网络扩容题解
查看>>
bzoj1878
查看>>
【Vegas原创】Mysql绿色版安装方法
查看>>
Thrift Expected protocol id ffffff82 but got 0
查看>>
分享《去哪儿网》前端笔试题
查看>>
2013-07-04学习笔记二
查看>>
CP15 协处理器寄存器解读
查看>>
【codeforces 787B】Not Afraid
查看>>
【9111】高精度除法(高精度除高精度)
查看>>
WPF 的二维绘图(二)——几何图形Geometry
查看>>
微信小程序之生成图片分享朋友圈
查看>>
BZOJ4817 [Sdoi2017]树点涂色 【LCT + 线段树】
查看>>
洛谷P1822 魔法指纹 【分块打表】
查看>>
jQuery UI Dialog使用
查看>>
在mac上安装gradle(超详细,直接按步骤操作即可轻松搞定)
查看>>