座位安排
二分图的板子。有许多很简单的二分图最大匹配问题被评到了蓝题感觉并不很合理。好久没有写过二分图的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;
}
一如既往,万事胜意