ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

YbtOJ「图论」第1章 二分图匹配 K. 男孩女孩 题解--zhengjun

2022-06-28 20:02:31  阅读:154  来源: 互联网

标签:head cur -- 题解 ++ int edge kk YbtOJ


思路

会发现要求一个最大的完全子图(每个点两两之间有连边),所以考虑把建出原图的反图,然后每个点两两之间有连边就转化成为了每个点两两之间没有连边,也就是二分图的最大独立子集,是需要用总点数-最大匹配即可。

代码

#include<bits/stdc++.h>
using namespace std;typedef long long ll;const int N=4e2+10,M=N*N;
int T,n,m,k,s,t,is[N][N],head[N],kk,d[N],cur[N];struct edges{int to,c,nex;}edge[M];
void add(int u,int v,int c){edge[++kk]={v,c,head[u]};head[u]=kk;edge[++kk]={u,0,head[v]};head[v]=kk;}
bool bfs(){
	queue<int>q;q.push(s);memset(d,-1,sizeof d);cur[s]=head[s];d[s]=0;for(int u;!q.empty();q.pop()){
		u=q.front();for(int i=head[u],v;v=edge[i].to,i;i=edge[i].nex)
			if(!~d[v]&&edge[i].c)d[v]=d[u]+1,cur[v]=head[v],q.push(v);
	}return ~d[t];
}
int dfs(int u,int lim=1e9){
	if(u==t)return lim;int flow=0;for(int i=head[u],v;v=edge[i].to,i&&flow<lim;i=edge[i].nex){
		if(d[v]!=d[u]+1||!edge[i].c)continue;int f=dfs(v,min(lim-flow,edge[i].c));
		if(!f)d[v]=-1;edge[i].c-=f;edge[i^1].c+=f;flow+=f;
	}return flow;
}
int dinic(){int maxflow=0;while(bfs())maxflow+=dfs(s);return maxflow;}
void clear(){memset(is,0,sizeof is);memset(head,0,sizeof head);kk=1;}
void get(){
	for(int i=1,u,v;i<=k;i++)scanf("%d%d",&u,&v),is[u][v]=1;s=0;t=n+m+1;for(int i=1;i<=n;i++)add(s,i,1);
	for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(!is[i][j])add(i,j+n,1);for(int i=1;i<=m;i++)add(i+n,t,1);
	printf("Case %d: %d\n",++T,n+m-dinic());
}
int main(){
	for(;~scanf("%d%d%d",&n,&m,&k)&&(n||m||k);)clear(),get();return 0;
}

标签:head,cur,--,题解,++,int,edge,kk,YbtOJ
来源: https://www.cnblogs.com/A-zjzj/p/16420848.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有