当前位置:网站首页>P2071 座位安排(二分图最大匹配)

P2071 座位安排(二分图最大匹配)

2021-08-10 08:43:41 wx6110fa547fd20

P2071 座位安排(二分图最大匹配)

照着模板的套路,只不过座位是可以匹配两个人的,所以开个二维数组即可。

匈牙利常见的优化,vis数组能用bool就用bool,貌似用bitset更快?,建图的话单向边就可以了。

code

// Problem: P2071 座位安排
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P2071
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// Date: 2021-07-05 21:27:33
// --------by Herio--------

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull; 
const int N=2e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define fi first
#define se second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define IOS ios::sync_with_stdio(false),cin.tie(0) 
void Print(int *a,int n){
	for(int i=1;i<n;i++)
		printf("%d ",a[i]);
	printf("%d\n",a[n]); 
}
int n,mh[N<<1][2];
struct edge{
	int to,nt;
}e[N<<2];
int h[N<<1],cnt;
bool vis[N<<1];
void add(int u,int v){
	e[++cnt]={v,h[u]},h[u]=cnt;
}
bool find(int u){
	for(int i=h[u];i;i=e[i].nt){
		int v=e[i].to;
		if(vis[v]) continue;
		vis[v]=true;
		for(int j=0;j<2;j++)
			if(!mh[v][j]||find(mh[v][j])){
			mh[v][j]=u;return true;
			}
		
	}
	return false;
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n<<1;i++){
		int u,v;scanf("%d%d",&u,&v);
		add(i,u),add(i,v);
	}
	int ans=0;
	for(int i=1;i<=n<<1;i++){
		mst(vis,0);
		if(find(i)) ans++;
	}
	printf("%d\n",ans);
	return 0;
}


      
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.

版权声明
本文为[wx6110fa547fd20]所创,转载请带上原文链接,感谢
https://blog.51cto.com/u_15326986/3328394

随机推荐