座位安排

link

二分图的板子。有许多很简单的二分图最大匹配问题被评到了蓝题感觉并不很合理。好久没有写过二分图的find了,果然我的记忆总是衰退得很快。二分图最大匹配的思想就是对于一个节点找寻増广路,这一过程是假如它找到了一个下家那肯定很好,肯定可以连一条新边。假如那个下家有意中人了没关系,让那个意中人去找下家,如果他找到了那肯定很好,当前找到的下家就归自己啦。要做好记忆化以及nt变量的维护。

还有就是要估计好边数,不论是网络流还是二分图,实在不行为了保险开个5e6也不是不可以。

还有一些水题:[HNOI2006]超级英雄 || [USACO09JAN]Total Flow S || [USACO11NOV]Cow Steeplechase G || [USACO06FEB]Steady Cow Assignment G || [USACO4.2]草地排水Drainage Ditches 。也包括一些网络流的水题。问题是为什么他们题名都这呃呃呃呃呃呃呃呃么长。

#include<bits/stdc++.h>
//#define feyn
const int N=8010;
using namespace std;
inline void read(int &wh){
	wh=0;int f=1;char w=getchar();
	while(w<'0'||w>'9'){if(w=='-')f=-1;w=getchar();}
	while(w>='0'&&w<='9'){wh=wh*10+w-'0';w=getchar();}
	wh*=f;return;
}

struct edge{
	int t,next;
}e[N<<1];
int head[N],esum;
inline void add(int fr,int to){
	e[++esum]=(edge){to,head[fr]};head[fr]=esum;
}

int m,p[N],t[N],nt;
inline bool find(int wh){
	for(int i=head[wh],th;i;i=e[i].next){
		if(t[th=e[i].t]==nt)continue;t[th]=nt;
		if(p[th]==0||find(p[th]))return p[th]=wh,true;
	}
	return false;
}

signed main(){
	
	#ifdef feyn
	freopen("in.txt","r",stdin);
	#endif
	
	read(m);m*=2;int s1,s2;
	for(int i=1;i<=m;i++){
		read(s1);read(s2);
		add(i,s1*2-1);add(i,s1*2);
		add(i,s2*2-1);add(i,s2*2);
	}
	int ans=0;nt++;
	for(int i=1;i<=m;i++,nt++)ans+=find(i);
	printf("%d",ans);
	
	return 0;
}
posted @ 2022-07-09 17:26  Feyn618  阅读(6)  评论(0编辑  收藏  举报