传送门:bzoj1854
题解
二分图最大匹配裸题。
代码
#include<bits/stdc++.h>
#define gc getchar()
#define si isdigit(c)
#define RI register
using namespace std;
const int N=1e6+10;
int head[N<<1],to[N*5],nxt[N*5],tot;
int n,mx,bel[N<<1],vis[N<<1];
struct P{int a,b;}eq[N];
char c;
inline void rd(int &x)
{
c=gc;x=0;
for(;!si;c=gc);
for(;si;c=gc) x=x*10+(c^48);
}
inline void lk(int u,int v)
{
to[++tot]=v;nxt[tot]=head[u];head[u]=tot;
to[++tot]=u;nxt[tot]=head[v];head[v]=tot;
}
inline bool match(int x,int id)
{
RI int i,j;vis[x]=id;
for(i=head[x];i;i=nxt[i]){
j=to[i];if(vis[j]==id) continue;
vis[j]=id;
if(!bel[j] || match(bel[j],id)) {bel[j]=x;return true;}
}
return false;
}
int main(){
RI int i;
rd(n);
for(i=1;i<=n;++i){
rd(eq[i].a);rd(eq[i].b);
mx=max(mx,max(eq[i].a,eq[i].b));
}
for(i=1;i<=n;++i)
lk(eq[i].a,i+mx),lk(eq[i].b,i+mx);
for(i=1;i<=mx;++i)
if(!match(i,i)) break;
printf("%d\n",i-1);
}